Как получить все даты между двумя датами?
1. обзор
Новый API времени, введенный в Java 8, позволил обрабатывать дату и время без использования внешних библиотек.
В этом коротком руководстве мы рассмотрим, как с течением времени упростить получение всех дат между двумя датами в разных версиях Java.
2. Использование Java 7
В Java 7 одним из способов вычисления является использование экземпляраCalendar, запуск цикла и добавление 1 дня в каждой итерации с использованием метода добавления и полевого модуляCalendar.Date, когда он достигает конечной даты.
Вот код, демонстрирующий это - с использованием экземпляраCalendar:
public static List getDatesBetweenUsingJava7(
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 мы теперь можем создавать непрерывные бесконечныеStreamдат и брать только соответствующую часть. К сожалению,there is no way of terminating an infinite Stream when a predicate gets matched - вот почему нам нужно вычислить количество дней между этими двумя днями, а затем простоlimit()Stream:
public static List getDatesBetweenUsingJava8(
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.
Затем мы создаемStream целых чисел, представляющих количество дней с даты начала. На следующем этапе мы конвертируем наши целые числа в объектыLocalDate с помощью APIplusDays().
Наконец, мы собираем все в экземпляр списка.
4. Использование Java 9
Наконец, Java 9 предоставляет специальные методы для вычисления этого:
public static List getDatesBetweenUsingJava9(
LocalDate startDate, LocalDate endDate) {
return startDate.datesUntil(endDate)
.collect(Collectors.toList());
}
Мы можем получить даты между двумя датами с помощью одного вызова метода, используя специальный методdatesUntil классаLocalDate. datesUntill возвращает последовательно упорядоченныеStream дат, начиная с объекта даты, метод которого вызывается до даты, указанной в качестве аргумента метода.
5. Заключение
В этой быстрой статье мы рассмотрели, как мы можем получить все даты между двумя датами, используя разные версии Java.
Мы обсудили, как Time API, представленный в выпуске Java 8, упростил выполнение операций над литералами даты, а в Java 9 это можно сделать, просто вызвавdatesUntil.
И, как всегда, фрагменты кода можно найтиover on GitHub.