Как получить все даты между двумя датами?

Как получить все даты между двумя датами?

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.