Научитесь получать все даты между двумя заданными датами. Мы увидим решения в 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;}