Подсчитайте количество дней, включая две указанные даты

Как посчитать количество дней между двумя LocalDateв Яве? Я пытался так

LocalDate startDate = LocalDate.parse("2016-11-02");
LocalDate endDate = LocalDate.parse("2016-11-04");

long days = startDate.until(endDate, ChronoUnit.DAYS);

//and

long days= ChronoUnit.DAYS.between(startDate, endDate);

//and

long days= Duration.between(startDate.atStartOfDay(), endDate.atStartOfDay()).toDays();

Все вышеперечисленное дает дни между двумя датами, но как считать с учетом обеих дат. Согласно вышеуказанным шагам, получение 2 дня как нет. дней, но требуется 3 дня.

3 ответа

В Javadoc ясно, что дата окончания не включена в расчет. Так что вы можете просто добавить 1:

long days = ChronoUnit.DAYS.between(startDate, endDate) + 1;

ТЛ; др

Начиная с того, чтобы быть включающим, и заканчивая, чтобы быть исключительным через промежуток времени, это норма.

Если вы абсолютно не можете следовать этому подходу, добавьте его.

days = days + 1 ;

Полуоткрытый

Распространенным и мудрым способом определения промежутка времени является подход Half-Open. Начало включительно, а окончание - эксклюзивно.

Иногда, но не всегда, мы используем этот подход интуитивно в повседневной жизни. Например, считается, что обеденный перерыв в классе начинается с полудня до 13:00, что означает, что все ученики должны быть возвращены в класс и готовы до того, как в 13:00 начнутся занятия. Класс, как говорят, работает с 13:00 до 14:00. Таким образом, пролеты могут примыкать друг к другу, не перекрывая друг друга, и без сложной задачи определения последнего момента бесконечно делимой последней секунды последней минуты этого часа.

Я предлагаю придерживаться этого подхода во всех ваших кодировках даты и времени, чтобы сделать ваш код более легким для чтения, отладкой и менее подверженным ошибкам, уменьшая когнитивную перегрузку разрешения неоднозначности, включающей исключающее включение.

Классы java.time везде используют подход Half-Open.

long days = ChronoUnit.DAYS.between( start , stop ) ;  // Half-open

Если ваш код должен возвращать результат, включающий окончание, просто добавьте его к результатам java.time.

long daysClosed = ( days + 1 ) ;

В идеале вы должны использовать Half-Open последовательно в своем коде и в пользовательском интерфейсе, одновременно обучая своих пользователей проблеме неоднозначности. Я видел бесчисленные ошибки, сделанные бизнесменами, ошибочно полагая, что диапазоны дат открыты (), закрыто [] или полуоткрытый [) и даже иногда противоположная половина закрыта (] пока автор имел ввиду другое.

Если вы хотите буквально 24 часа в сутки, вы можете использовать Duration класс вместо:

long days = Duration.between(startDate.atStartOfDay(), endDate.atStartOfDay()).toDays() + 1;

Для получения дополнительной информации, пожалуйста, смотрите этот документ относительно Java SE 8 Дата и время.

Другие вопросы по тегам