Подсчитайте количество дней, включая две указанные даты
Как посчитать количество дней между двумя 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 Дата и время.