Статьи Генератор паролей UUID MD5 Unix-время URL-encode Base64 Форматирование XML Ваш внешний IP Число прописью


Как получить все даты в указанном диапазоне

Вернуться назад

26 января 2020

Тэги: Stream API Java 9 Java 8

Предположим, у нас есть дата начала dateTill и дата окончания dateFrom некоторого временного диапазона. И нам нужно получить список, содержащий все даты из этого диапазона. Как это сделать? Есть два варианта.

Вариант для Java 9

Если у вас Java версии 9 или более поздняя, то можно использовать такой лаконичный вариант:

public List<LocalDate> getDatesFromInterval(LocalDate dateFrom, LocalDate dateTill) {
    return dateFrom.datesUntil(dateTill.plusDays(1))
            .collect(Collectors.toList());
}

Метод LocalDate.datesUntil() порождает поток, начинающийся с указанной даты и заканчивающийся датой, переданной в этот метод в качестве параметра. Чтобы конечная дата также попала в выборку, прибавляем к ней ещё один день с помощью метода plusDays(). В конце превращаем этот поток в список, используя метод collect().

Вариант для Java 8

Если вам «повезло» и у вас Java 8, нужно написать чуть больше кода:

public List<LocalDate> getDatesFromIntervalJava8(LocalDate dateFrom, LocalDate dateTill) {
    long numOfDaysBetween = ChronoUnit.DAYS.between(dateFrom, dateTill) + 1;
    return IntStream.iterate(0, i -> i + 1)
            .limit(numOfDaysBetween)
            .mapToObj(dateFrom::plusDays)
            .collect(Collectors.toList());
}

Сначала вычислим количество дней между указанными датами, используя перечисление ChronoUnit. Оно содержит различные единицы измерения времени: миллисекунды, секунды, минуты, часы, месяцы и даже года. Каждая из этих единиц поддерживает метод between(), который возращает количество единиц времени между двумя датами, включая дату начала и исключая дату окончания. Мы добавляем единицу, чтобы также включить дату окончания.

Затем формируем поток целых чисел, начинающийся с нуля и определяем правило формирования следующего элемента. В нашем случае это приращение i + 1. Мы получаем бесконечный поток целых чисел, поэтому ограничиваем его с помощью метода limit(). А метод mapToObj() создаёт сами объекты нужных нам дат, прибавляя к дате начала количество дней, равное текущему элементу потока. В конце собираем всё это в стандартный список.