java.time
Ответ Доналя с использованием Joda-Time правильный, но устаревший. Команда Joda-Time посоветовала нам перейти на инфраструктуру java.time, встроенную в Java 8 и более поздние версии. Большая часть функциональности java.time была перенесена на Java 6 & 7 и далее адаптирована для Android .
LocalDate
Для значения только для даты, без времени суток и без часового пояса, используйте класс LocalDate
.
Half-Open
Обычно лучшая практика обработки промежутка времени называется Half-Open. В этом подходе начало диапазона составляет включительно , в то время как окончание исключительно . Таким образом, с примером кода ниже, вы увидите, что результаты не включают в себя stop
дату. Если вы настаиваете на окончании включительно, измените date.isBefore ( stop )
на ! date.isAfter ( stop )
.
Пример кода
В своем текущем состоянии Вопрос является расплывчатым, не затрагивая такие вопросы, как рассмотрение вопроса о том, совпадает ли дата начала с началом недели или началом месяца и т. Д. Другой вопрос: использовать ли Half-Open подход или нет. Таким образом, эти вопросы оставлены в качестве упражнения для читателя. ; -)
Этот код подсчитывает количество дней в промежутке времени. Если до недели, мы петли изо дня в день. Если больше недели, мы делаем цикл неделя за неделей. Та же логика может быть расширена для обработки месяц за месяцем, квартал за кварталом и год за годом, как указано в Вопросе.
LocalDate start = LocalDate.of ( 2016 , Month.JANUARY , 2 );
LocalDate stop = start.plusDays ( 4 );
// LocalDate stop = start.plusWeeks ( 4 );
long days = ChronoUnit.DAYS.between ( start , stop );
List<LocalDate> dates = new ArrayList<> ();
if ( days == 0 ) {
dates.add ( start );// Just one date, as start equals stop.
} else if ( days < 7 ) { // Under a week, count day-by-day.
LocalDate date = start;
do {
dates.add ( date );
// Prep for next loop.
date = date.plusDays ( 1 );
} while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.
} else if ( days > 7 ) { // Over a week, count week-by-week.
LocalDate date = start;
do {
dates.add ( date );
// Prep for next loop.
date = date.plusWeeks ( 1 );
} while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.
} else {
// FIXME: ERROR. Should not be possible.
}
Дамп на консоль.
System.out.println ( "start: " + start + " | stop: " + stop + " | dates: " + dates );
При запуске со строкой для stop
добавление 4 дней :
начало: 2016-01-02 | остановка: 2016-01-06 | даты: [2016-01-02, 2016-01-03, 2016-01-04, 2016-01-05]
При запуске со строкой stop
добавление 4 недель :
начало: 2016-01-02 | остановка: 2016-01-30 | даты: [2016-01-02, 2016-01-09, 2016-01-16, 2016-01-23]