1. Обзор
Новый API времени, представленный в Java 8, позволил обрабатывать дату и время без использования внешних библиотек.
В этом коротком уроке мы рассмотрим, как получение всех дат между двумя датами становится проще с течением времени в разных версиях Java.
2. Использование Java 7
В Java 7 одним из способов его вычисления является использование экземпляра Calendar , запуск цикла и добавление 1 дня в каждой итерации с помощью метода add и Calendar.Дата единица измерения поля она достигает конечной даты.
Вот код, демонстрирующий это – использование Calendar экземпляра:
public static ListgetDatesBetweenUsingJava7( Date startDate, Date endDate) { List datesInRange = new ArrayList<>(); Calendar calendar = new GregorianCalendar(); calendar.setTime(startDate); Calendar endCalendar = new GregorianCalendar(); endCalendar.setTime(endDate); while (calendar.before(endCalendar)) { Date result = calendar.getTime(); datesInRange.add(result); calendar.add(Calendar.DATE, 1); } return datesInRange; }
3. Использование Java 8
В Java 8 теперь мы можем создавать непрерывный бесконечный Поток дат и принимать только соответствующую часть. К сожалению, нет способа завершить бесконечный поток при совпадении предиката – вот почему нам нужно вычислить количество дней между этими двумя днями, а затем просто limit() поток :
public static ListgetDatesBetweenUsingJava8( LocalDate startDate, LocalDate endDate) { long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate); return IntStream.iterate(0, i -> i + 1) .limit(numOfDaysBetween) .mapToObj(i -> startDate.plusDays(i)) .collect(Collectors.toList()); }
Обратите внимание, как, во – первых, мы можем получить разницу в днях между двумя датами, используя функцию between , связанную с константой DAYS перечисления ChronoUnit .
Затем мы создаем Поток целых чисел, представляющих количество дней с даты начала. На следующем шаге мы преобразуем ваши целые числа в Локальные данные объекты с помощью plus Days() API.
Наконец, мы собираем все в экземпляр списка.
4. Использование Java 9
Наконец, Java 9 предлагает специальные методы для расчета этого:
public static ListgetDatesBetweenUsingJava9( LocalDate startDate, LocalDate endDate) { return startDate.datesUntil(endDate) .collect(Collectors.toList()); }
Мы можем получить даты между двумя датами с помощью одного вызова метода, используя выделенный метод dates Until класса LocalDate|/. dates until возвращает последовательно упорядоченный Поток дат, начиная с объекта date, метод которого вызывается, до даты, заданной в качестве аргумента метода.
5. Заключение
В этой краткой статье мы рассмотрели, как мы можем получить все даты между двумя датами, используя разные версии Java.
Мы обсудили, как API времени, представленный в выпуске Java 8, облегчил выполнение операций над литералами даты, а в Java 9 это можно сделать, просто вызвав datesUntil.
И, как всегда, фрагменты кода можно найти на GitHub .