java.time & Half-Open
java.time классы, которые заменяют проблемные унаследованные классы даты и времени, а также проект Joda-Time определяют промежуток времени, используя подход Half-Open [), где начало включительно , в то время как окончание исключительно .
Для даты-времени с долей секунды это устраняет проблему попытки запечатлеть последний момент. Бесконечно делимая последняя секунда должна быть разрешена, но различные системы используют различные гранулярности, такие как миллисекунды, микросекунды, наносекунды или что-то еще. Например, в Half-Open день начинается с первого момента дня и продолжается, но не включает , а не , первый момент следующего дня. Проблема решена, нет необходимости бороться с последним моментом дня и его долей секунды.
Я пришел к выводу о преимуществах использования этого подхода последовательно во всем моем коде обработки даты и времени. Например, неделя, начинающаяся с понедельника, заканчивается, но не включает следующий понедельник. Месяц начинается 1-го числа и длится до первого числа следующего месяца, но не включает в себя, таким образом, игнорируется задача определения номера последнего дня месяца, включая високосный год 28/29 февраля.
Еще одним преимуществом последовательного использования Half-Open [) является облегчение когнитивной нагрузки каждый раз, когда мне приходится обнаруживать, расшифровывать и проверять часть кода в подходе с временным интервалом. В моем собственном программировании я просто заглядываю упоминание о Half-Open в комментарии сверху и сразу же знаю, как читать этот код.
Результатом последовательного использования Half-Open является снижение вероятности ошибок в моем коде, так как мой стиль мышления и написания одинаков, и у меня нет шансов запутаться из-за эксклюзивности.
Кстати, обратите внимание, что Half-Open [) означает избегать соединения SQL BETWEEN
, поскольку оно всегда полностью закрыто [].
Что касается делового мышления клиентов, которых я обслуживаю, там, где это уместно, я стараюсь убедить их также постоянно использовать Half-Open. Я видел много ситуаций, когда различные бизнесмены делали неверные предположения относительно периодов времени, указанных в отчетах. Последовательное использование Half-Open позволяет избежать этих неприятных неясностей. Но если клиент настаивает, я отмечаю это в своем коде и настраиваю входы / выходы так, чтобы использовать Half-Open в моей собственной логике. Например, моя логика использует неделю с понедельника по понедельник, но в отчете вычтите день, чтобы показать воскресенье.
Еще больше классов, представляющих промежутки времени с подходом Half-Open [), см. В проекте ThreeTen-Extras для его класса Interval
(пара объектов Instant
) и LocalDateRange
класс (пара объектов LocalDate
).
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .