Статьи Утилиты Telegram YouTube Отзывы

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

26 января 2020

Тэги: Collections, Java, Stream API.

Содержание

  1. Вариант для Java 9
  2. Вариант для 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() создаёт сами объекты нужных нам дат, прибавляя к дате начала количество дней, равное текущему элементу потока. В конце собираем всё это в стандартный список.


Облако тэгов

Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.

Последние статьи


Комментарии

Добавить комментарий

×

devmark.ru