В библиотеке js-joda система единиц измерения времени построена вокруг строгой иерархии, отражающей как физические интервалы времени, так и календарные единицы, зависящие от контекста даты и часового пояса. Основу этой системы составляет перечисление ChronoUnit, которое формализует допустимые операции измерения и преобразования времени на разных уровнях точности.
ChronoUnit представляет собой центральный механизм, описывающий единицы измерения времени от наносекунд до эпохальных интервалов. Каждая единица определяет два ключевых аспекта: возможность точного вычисления разницы между временными точками и корректность операций сложения/вычитания.
Поддерживаемые единицы включают:
Эти единицы делятся на две фундаментальные группы:
Различие критично: точные единицы всегда имеют фиксированную длительность, тогда как календарные зависят от календарной системы, високосных лет, длины месяцев и переходов часовых поясов.
Точные единицы времени в js-joda опираются на абсолютную шкалу, независимую от календаря и локали.
Эти единицы используются для низкоуровневых операций:
Они применяются в работе с Instant и Duration, где важна абсолютная точность.
Следующий уровень агрегирования:
Эти единицы сохраняют детерминированность и подходят для вычислений длительности без календарных искажений.
Половина суток фиксируется как 12 часов. Эта единица используется редко, но важна при работе с 12-часовыми циклами и некоторыми календарными представлениями.
Календарные единицы вводят зависимость от структуры календаря, что делает их результат контекстно-зависимым.
День в js-joda не всегда равен 24 часам в абсолютном смысле. Его длительность зависит от:
В ZonedDateTime добавление одного дня может изменить абсолютную длительность интервала.
Неделя трактуется как фиксированное смещение в 7 календарных дней. Однако при работе с временными зонами итоговая длительность в часах может варьироваться.
Месяц является одной из наиболее вариативных единиц:
Операции с месяцами выполняются только на уровнях LocalDate и выше.
Год также относится к календарным единицам:
Добавление одного года сохраняет календарную логику даты, но не гарантирует фиксированную длительность.
ChronoUnit включает крупномасштабные единицы, предназначенные для исторических и астрономических вычислений:
Эти единицы используются в основном при работе с расширенными календарными системами и историческими датами.
Duration представляет собой измерение времени в фиксированных единицах, основанных на абсолютной шкале:
Duration не поддерживает месяцы и годы, так как их длительность неоднозначна.
Принцип работы Duration:
Пример логики:
Period представляет календарные интервалы:
В отличие от Duration, Period сохраняет структуру календаря, а не абсолютную длительность.
Особенности:
Period корректно работает с неравномерными интервалами, сохраняя смысл календарных операций.
Разные типы js-joda поддерживают разные подмножества ChronoUnit.
Поддерживает только точные единицы:
Не поддерживает месяцы и годы.
Поддерживает календарные единицы:
Операции выполняются без учета времени суток.
Работает только с точными единицами:
Поддерживает полный набор, включая календарные единицы, но с учетом временной зоны и переходов DST, что влияет на фактическую длительность интервалов.
js-joda предоставляет унифицированные операции:
Позволяет добавлять или вычитать единицы:
Поведение зависит от типа даты.
Используется для вычисления разницы между двумя моментами времени в заданной единице:
start.until(end, ChronoUnit.DAYS)start.until(end, ChronoUnit.MONTHS)Результат зависит от природы единицы: для точных — фиксированное число, для календарных — вычисление через календарную модель.
Аналогично until, но с измененным порядком аргументов в некоторых API-обертках. Возвращает количество единиц между двумя моментами.
В ZonedDateTime система единиц измерения времени сталкивается с эффектами переходов DST:
Это приводит к различию между:
Первое — фиксированный интервал, второе — календарное смещение.
Ключевое различие систем выражается в двух моделях:
Физическая модель:
Календарная модель:
Переход между Duration и Period невозможен напрямую без контекста даты:
Для преобразования используется:
При работе с ChronoUnit библиотека применяет следующие принципы:
Система ChronoUnit и связанные типы формируют единый слой абстракции, который:
Модель единиц измерения времени в js-joda является фундаментом для всех операций с датами и временем, обеспечивая согласованность между абсолютными интервалами и календарными смещениями без потери семантики каждого уровня представления времени.