Получение всех дат между двумя датами в Java

Научитесь получать все даты между двумя заданными датами. Мы увидим решения в Java 7, Java 8 и Java 9.

1. LocalDate.datesUntil()(начиная с Java 9)

Метод datesUntil()LocalDate возвращает последовательный упорядоченный поток всех дат между двумя заданными датами. Возвращаемый поток начинается с startDate(включительно) и продолжается до endDate(исключительно) с шагом в 1 день.

LocalDate startDate = LocalDate.now();LocalDate endDate = startDate.plusMonths(2);List<LocalDate> listOfDates = startDate.datesUntil(endDate).collect(Collectors.toList());System.out.println(listOfDates.size()); // 61

2. Использование потокового API

Чтобы получить все даты, создайте поток дат, добавляя 1 к startDate и так далее, до endDate.

LocalDate startDate = LocalDate.now();LocalDate endDate = startDate.plusMonths(2);long numOfDays = ChronoUnit.DAYS.between(startDate, endDate);List<LocalDate> listOfDates = Stream.iterate(startDate, date -> date.plusDays(1)).limit(numOfDays).collect(Collectors.toList());System.out.println(listOfDates.size()); // 61

Один и тот же поток дат можно получить несколькими способами. Например, LongStream — один из таких способов.

LocalDate startDate = LocalDate.now();LocalDate endDate = startDate.plusMonths(2);long numOfDays = ChronoUnit.DAYS.between(startDate, endDate);List<LocalDate> listOfDates = LongStream.range(0, numOfDays).mapToObj(startDate::plusDays).collect(Collectors.toList());System.out.println(listOfDates.size()); // 61

3. Создание всех дат в цикле – Java 7

Чтобы получить все даты от startDate до endDate в Java 7, мы должны написать собственную логику, поскольку поддержка API в JDK очень ограничена. Или же рассмотрите возможность использования сторонних библиотек, например Joda-time.

Date todaysDate = new Date();Date anotherDate = new Date(todaysDate.getTime() + 61*24*60*60*1000l);List<Date> listOfDates3 = getDaysBetweenDates(todaysDate, anotherDate);System.out.println(listOfDates3.size()); //61public static List<Date> getDaysBetweenDates(Date startdate, Date enddate){List<Date> dates = new ArrayList<>();Calendar calendar = new GregorianCalendar();calendar.setTime(startdate);while(calendar.getTime().before(enddate)){Date result = calendar.getTime();dates.add(result);calendar.add(Calendar.DATE, 1);}return dates;}

Исходный код Скачать

Прокрутить вверх