Утилитарные классы

В библиотеке используется набор стандартных единиц для арифметики времени и даты, представленных перечислением ChronoUnit (js-joda). Эти единицы задают гранулярность операций добавления, вычитания и вычисления разницы между временными объектами.

Ключевые единицы включают:

  • NANOS — наносекунды
  • MICROS — микросекунды
  • MILLIS — миллисекунды
  • SECONDS — секунды
  • MINUTES — минуты
  • HOURS — часы
  • HALF_DAYS — половина суток
  • DAYS — дни
  • WEEKS — недели
  • MONTHS — месяцы
  • YEARS — годы
  • DECADES, CENTURIES, MILLENNIA — крупные исторические интервалы

Использование единиц строится вокруг унифицированного интерфейса: каждая временная модель поддерживает операции plus, minus, until, принимая в качестве аргумента конкретную единицу измерения.

Особенность модели заключается в строгой семантике календарных и абсолютных единиц. Например, месяцы и годы зависят от календаря, тогда как секунды и миллисекунды являются фиксированными длительностями.


ChronoField и доступ к компонентам даты и времени

Низкоуровневый доступ к структуре временных объектов реализован через ChronoField (js-joda).

Каждое поле представляет конкретный компонент временной шкалы:

  • YEAR — год
  • MONTH_OF_YEAR — месяц в году
  • DAY_OF_MONTH — день месяца
  • DAY_OF_WEEK — день недели
  • HOUR_OF_DAY — час
  • MINUTE_OF_HOUR — минуты
  • SECOND_OF_MINUTE — секунды
  • NANO_OF_SECOND — наносекунды

Модель доступа унифицирована: любое временное значение может быть опрошено через get(field) или проверено через range().

Особое значение имеет концепция диапазонов допустимых значений. Например, MONTH_OF_YEAR ограничен диапазоном 1–12, а DAY_OF_WEEK — 1–7. Это позволяет выполнять валидацию на уровне типов без дополнительных проверок.


TemporalAdjusters и правила трансформации дат

Механизм преобразования дат реализован через TemporalAdjusters (js-joda). Это набор функций, которые изменяют временные объекты по предопределённым правилам.

Поддерживаются следующие категории преобразований:

Позиционные корректировки

  • первый день месяца
  • последний день месяца
  • первый день года
  • последний день года

Относительные корректировки

  • следующий день недели
  • предыдущий день недели
  • следующий или равный день недели

Календарные правила

  • переход к первому рабочему дню
  • переход к последнему рабочему дню месяца

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


DateTimeFormatter и форматирование временных объектов

Форматирование и парсинг реализованы через DateTimeFormatter (js-joda).

Форматтеры поддерживают:

  • стандартные ISO-форматы
  • локализованные шаблоны
  • пользовательские паттерны

Основные элементы шаблонов:

  • yyyy — год
  • MM — месяц
  • dd — день
  • HH — часы (24-часовой формат)
  • mm — минуты
  • ss — секунды

Форматтеры работают в двух направлениях:

  1. Формирование строки из временного объекта
  2. Парсинг строки в структурированное представление

Особенностью является строгая типизация результата: некорректные строки приводят к исключению на этапе разбора, а не к частично валидным данным.


Clock и абстракция текущего времени

Абстракция текущего времени реализуется через Clock (js-joda).

Clock предоставляет единый источник времени, что позволяет:

  • получать текущий момент (Instant)
  • фиксировать время для тестирования
  • эмулировать различные часовые пояса

Основные реализации:

  • system default clock — системное время
  • fixed clock — фиксированная точка времени
  • offset clock — смещение относительно базового времени

Использование Clock устраняет прямую зависимость от системных вызовов, что критично для детерминированных вычислений и тестов временной логики.


ZoneId и ZoneOffset как утилиты работы с часовыми поясами

Работа с временными зонами осуществляется через ZoneId (js-joda) и ZoneOffset (js-joda).

ZoneId описывает полноценную временную зону, учитывающую:

  • исторические изменения
  • правила перехода на летнее время
  • региональные особенности

ZoneOffset представляет фиксированное смещение от UTC без динамических правил.

Сочетание этих двух сущностей позволяет разделять:

  • статическое смещение (например, UTC+3)
  • региональную временную логику (например, Europe/Paris)

Duration и Period как вспомогательные утилитарные модели

Временные интервалы представлены двумя различными концепциями:

  • Duration (js-joda) — точные интервалы времени
  • Period (js-joda) — календарные интервалы

Duration оперирует фиксированными единицами времени:

  • секунды
  • наносекунды

Period оперирует календарными компонентами:

  • годы
  • месяцы
  • дни

Разделение основано на различии между абсолютным и календарным временем. Например, один месяц не имеет фиксированной длительности, тогда как одна секунда всегда равна одной секунде.


Month, DayOfWeek и перечисления календаря

Календарные перечисления включают Month (js-joda) и DayOfWeek (js-joda).

Month определяет 12 фиксированных значений календаря:

  • JANUARY … DECEMBER

DayOfWeek определяет 7-дневный цикл:

  • MONDAY … SUNDAY

Обе структуры используются в:

  • вычислении границ периодов
  • календарных правилах смещения
  • форматировании дат

Особенность заключается в наличии методов навигации:

  • plus(n) — переход вперёд
  • minus(n) — переход назад

Утилитарные операции сравнения и диапазонов

Базовые операции сравнения встроены в каждый временной тип, однако библиотека предоставляет унифицированные утилитарные подходы:

  • сравнение через isBefore, isAfter, isEqual
  • проверка включения в диапазон через isBetween (в пользовательских реализациях)
  • вычисление расстояний через until

Сравнение выполняется в контексте абсолютного времени или календарной логики в зависимости от типа объекта.


Системы преобразования и нормализации значений

Механизмы нормализации обеспечивают приведение временных объектов к согласованному виду:

  • автоматическое преобразование часовых поясов
  • корректировка переполнений (например, 60 минут → 1 час)
  • нормализация календарных значений при арифметических операциях

Особое значение имеет строгая неизменяемость объектов: любая операция возвращает новый экземпляр, сохраняя исходное состояние без изменений.


Взаимодействие утилитарных компонентов

Утилитарные классы образуют связанный слой над базовыми временными структурами:

  • ChronoUnit определяет «в чём измеряется»
  • ChronoField определяет «из чего состоит»
  • TemporalAdjusters определяет «как изменяется»
  • DateTimeFormatter определяет «как отображается»
  • Clock определяет «откуда берётся текущее время»
  • ZoneId/ZoneOffset определяют «в каком контексте времени»
  • Duration/Period определяют «сколько длится интервал»
  • Month/DayOfWeek определяют «календарную структуру»

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