Автор оригинала: Norberto Ritzmann.
1. Обзор
В этом кратком руководстве мы рассмотрим несколько способов итерации по диапазону дат, используя начальную и конечную даты, в Java 7, Java 8 и Java 9.
2. Java 7
Начиная с Java 7, мы будем использовать класс java.util.Date для хранения значений даты и java.util.Календарь для приращения от одной даты к другой.
Давайте рассмотрим пример использования простого цикла while вместе с java.util.Дата и java.util.Календарь классы:
void iterateBetweenDatesJava7(Date start, Date end) { Date current = start; while (current.before(end)) { processDate(current); Calendar calendar = Calendar.getInstance(); calendar.setTime(current); calendar.add(Calendar.DATE, 1); current = calendar.getTime(); } }
3. Java 8
Начиная с Java 8, мы можем использовать новый Java 8 Date API . Это дает нам самодостаточные, неизменяемые, плавные и потокобезопасные объекты. Он также позволяет нам писать более чистый код без необходимости в вспомогательном классе как java.util.Календарь для увеличения дат.
Давайте используем простой цикл for , класс LocalDate и метод plusDays(1) для перемещения вперед по диапазону дат:
void iterateBetweenDatesJava8(LocalDate start, LocalDate end) { for (LocalDate date = start; date.isBefore(end); date = date.plusDays(1)) { processDate(date); } }
Здесь стоит отметить, что хотя Stream API доступен начиная с Java 8, итерация между двумя датами с использованием Date API в сочетании с Stream API невозможна до Java 9 .
Пожалуйста, ознакомьтесь с этой статьей для более подробного объяснения Java 8 Date API.
4. Java 9+
Java 9 вводит метод dates Until, который позволяет нам использовать Stream API для итерации от даты начала до даты окончания.
Давайте обновим наш пример кода, чтобы воспользоваться этой функцией:
void iterateBetweenDatesJava9(LocalDate start, LocalDate end) { start.datesUntil(end).forEach(this::processDate); }
5. Заключение
Как мы видели в этой краткой статье, итерация по диапазону дат является простой задачей в Java. Это особенно верно при использовании Java 8 и более поздних версий, где мы можем легче обрабатывать даты с помощью API Date.
Обратите внимание, что в Java 7 и более ранних версиях рекомендуется иметь дело как с датой, так и со временем, даже если мы используем только даты.
Однако с Java 8 и более поздними версиями у нас есть преимущество выбора подходящего класса из API даты, такого как LocalDate, | LocalDateTime, и других вариантов, в соответствии с нашими потребностями.
И конечно, начиная с Java 9, мы можем использовать Stream API в сочетании с Date API для итерации потока дат.
Как всегда, фрагменты кода можно найти на GitHub .