В библиотеке используется набор стандартных единиц для арифметики времени и даты, представленных перечислением ChronoUnit (js-joda). Эти единицы задают гранулярность операций добавления, вычитания и вычисления разницы между временными объектами.
Ключевые единицы включают:
Использование единиц строится вокруг унифицированного интерфейса:
каждая временная модель поддерживает операции plus,
minus, until, принимая в качестве аргумента
конкретную единицу измерения.
Особенность модели заключается в строгой семантике календарных и абсолютных единиц. Например, месяцы и годы зависят от календаря, тогда как секунды и миллисекунды являются фиксированными длительностями.
Низкоуровневый доступ к структуре временных объектов реализован через ChronoField (js-joda).
Каждое поле представляет конкретный компонент временной шкалы:
Модель доступа унифицирована: любое временное значение может быть
опрошено через get(field) или проверено через
range().
Особое значение имеет концепция диапазонов допустимых значений.
Например, MONTH_OF_YEAR ограничен диапазоном 1–12, а
DAY_OF_WEEK — 1–7. Это позволяет выполнять валидацию на
уровне типов без дополнительных проверок.
Механизм преобразования дат реализован через TemporalAdjusters (js-joda). Это набор функций, которые изменяют временные объекты по предопределённым правилам.
Поддерживаются следующие категории преобразований:
Механизм основан на функции-адаптере, принимающей объект временной шкалы и возвращающей новый экземпляр без изменения исходного значения. Это поддерживает неизменяемость модели данных.
Форматирование и парсинг реализованы через DateTimeFormatter (js-joda).
Форматтеры поддерживают:
Основные элементы шаблонов:
yyyy — годMM — месяцdd — деньHH — часы (24-часовой формат)mm — минутыss — секундыФорматтеры работают в двух направлениях:
Особенностью является строгая типизация результата: некорректные строки приводят к исключению на этапе разбора, а не к частично валидным данным.
Абстракция текущего времени реализуется через Clock (js-joda).
Clock предоставляет единый источник времени, что позволяет:
Основные реализации:
Использование Clock устраняет прямую зависимость от системных вызовов, что критично для детерминированных вычислений и тестов временной логики.
Работа с временными зонами осуществляется через ZoneId (js-joda) и ZoneOffset (js-joda).
ZoneId описывает полноценную временную зону, учитывающую:
ZoneOffset представляет фиксированное смещение от UTC без динамических правил.
Сочетание этих двух сущностей позволяет разделять:
Временные интервалы представлены двумя различными концепциями:
Duration оперирует фиксированными единицами времени:
Period оперирует календарными компонентами:
Разделение основано на различии между абсолютным и календарным временем. Например, один месяц не имеет фиксированной длительности, тогда как одна секунда всегда равна одной секунде.
Календарные перечисления включают Month (js-joda) и DayOfWeek (js-joda).
Month определяет 12 фиксированных значений календаря:
DayOfWeek определяет 7-дневный цикл:
Обе структуры используются в:
Особенность заключается в наличии методов навигации:
plus(n) — переход вперёдminus(n) — переход назадБазовые операции сравнения встроены в каждый временной тип, однако библиотека предоставляет унифицированные утилитарные подходы:
isBefore, isAfter,
isEqualisBetween (в
пользовательских реализациях)untilСравнение выполняется в контексте абсолютного времени или календарной логики в зависимости от типа объекта.
Механизмы нормализации обеспечивают приведение временных объектов к согласованному виду:
Особое значение имеет строгая неизменяемость объектов: любая операция возвращает новый экземпляр, сохраняя исходное состояние без изменений.
Утилитарные классы образуют связанный слой над базовыми временными структурами:
Совместное использование этих компонентов формирует единый механизм работы с временными данными, где каждая утилита отвечает за строго ограниченную область ответственности без пересечения логики.