Типы Luxon

Luxon строится вокруг объекта DateTime, который является основным типом для работы с датой и временем. В отличие от нативного Date, который хранит только абсолютное время в виде UTC-таймстампа, DateTime инкапсулирует контекст: временную зону, локаль, календарные параметры и правила форматирования.

DateTime — неизменяемый (immutable) объект, любое преобразование возвращает новый экземпляр, а не модифицирует существующий.

Ключевые свойства внутреннего состояния:

  • ts — Unix timestamp в миллисекундах
  • zone — объект временной зоны
  • locale — локаль форматирования
  • invalid — состояние валидности экземпляра
  • isLuxonDateTime — маркер типа

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


Duration — представление длительности

Тип Duration описывает промежуток времени без привязки к конкретной точке на временной шкале. В отличие от DateTime, он не содержит абсолютного момента.

Duration хранит значение в виде набора полей:

  • годы
  • месяцы
  • недели
  • дни
  • часы
  • минуты
  • секунды
  • миллисекунды

Особенность заключается в том, что Duration может быть:

  • нормализованным (например, 90 секунд → 1 минута 30 секунд)
  • ненормализованным (raw representation)

Duration поддерживает арифметику:

  • сложение и вычитание
  • масштабирование
  • преобразование в единицы времени

Важно, что некоторые операции зависят от контекста календаря (например, месяцы имеют переменную длину), поэтому Duration не всегда может быть точно переведён в миллисекунды без потери смысла.


Interval — временной интервал

Interval представляет собой диапазон между двумя DateTime-значениями: началом и концом.

Структура Interval:

  • start: DateTime
  • end: DateTime

Основные свойства:

  • проверка пересечений интервалов
  • объединение интервалов
  • разбиение интервалов
  • проверка включения точки или другого интервала

Interval оперирует логикой множества на временной оси, что делает его полезным для календарей, расписаний и планирования.

Ключевая особенность — строгое требование валидности границ: end не может быть раньше start.


Zone — абстракция временной зоны

Тип Zone определяет правила интерпретации времени. Это базовый интерфейс, который реализуется несколькими конкретными типами зон.

Zone отвечает за:

  • смещение относительно UTC
  • правила перехода на летнее/зимнее время
  • интерпретацию локального времени

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

  • IANAZone
  • FixedOffsetZone
  • SystemZone

Zone не хранит время — он определяет контекст его чтения и отображения.


IANAZone — стандартные временные зоны

IANAZone использует базу tz database (например, Europe/Moscow, Asia/Tokyo).

Свойства:

  • динамическое смещение
  • поддержка DST (daylight saving time)
  • исторические изменения правил

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


FixedOffsetZone — фиксированное смещение

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

Примеры:

  • UTC+3
  • UTC-5

Характеристики:

  • простота вычислений
  • отсутствие DST
  • стабильность

Используется в случаях, где требуется неизменяемое смещение независимо от региона.


SystemZone — системная временная зона

SystemZone отражает локальные настройки окружения (браузера или операционной системы).

Особенности:

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

SystemZone является прокси-типом, который делегирует логику системе исполнения.


Info — тип метаинформации

Info — утилитарный тип, предоставляющий данные о календарных системах и локалях.

Он не представляет дату или время, а используется для получения справочной информации:

  • названия месяцев
  • дни недели
  • поддерживаемые локали
  • доступные временные зоны

Info работает как статический поставщик данных и не хранит состояние.


Settings — глобальные настройки поведения

Settings — глобальный конфигурационный слой библиотеки.

Отвечает за:

  • глобальную локаль
  • defaultZone
  • defaultLocale
  • defaultOutputCalendar

Особенность Settings заключается в том, что он влияет на создание всех DateTime-объектов, если параметры явно не указаны.

Это делает Settings глобальным контекстом выполнения временных операций.


Locale — тип локализации

Locale определяет правила форматирования и интерпретации:

  • формат дат
  • формат времени
  • названия месяцев и дней
  • правила календаря

Хотя Locale не всегда выделяется как отдельный класс, он является логическим типом внутри DateTime и Settings.

Locale влияет на:

  • toLocaleString
  • toFormat
  • парсинг строк

OutputCalendar — календарные системы

Luxon поддерживает разные календарные системы, которые влияют на отображение дат.

Основные варианты:

  • gregory (Григорианский календарь)
  • buddhist
  • chinese
  • hebrew
  • islamic

OutputCalendar изменяет только отображение, не затрагивая внутренний timestamp.


Invalid — модель ошибок типов

Invalid представляет состояние некорректного DateTime или Duration.

Содержит:

  • reason — причина ошибки
  • explanation — текстовое описание

Примеры причин:

  • неправильный формат даты
  • невозможность парсинга строки
  • некорректная временная зона

Invalid является важным типом для безопасной работы, так как позволяет избегать silent failures.


Внутренние типы и структурные контракты

Luxon активно использует структурную типизацию, особенно в TypeScript.

Ключевые внутренние типы:

  • ObjectLike — обобщённый словарь значений даты
  • DateTimeOptions — параметры создания DateTime
  • DurationLike — объект-представление длительности
  • ZoneLike — входные данные для зоны

Эти типы не являются пользовательскими классами, но определяют контракт API.


Типовая модель преобразований

Все основные типы Luxon связаны через преобразования:

  • DateTime → Duration (diff)
  • DateTime → Interval (range creation)
  • Duration → DateTime (apply/add/subtract)
  • Zone → DateTime (reinterpretation)
  • Locale → formatting pipeline

Эта система типов формирует единый граф взаимодействий, где каждый объект имеет строго определённую роль и не пересекается по ответственности с другими.


Стабильность и неизменяемость типов

Все основные типы (DateTime, Duration, Interval) обладают неизменяемой природой. Это означает:

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

Каждая операция создаёт новый экземпляр, что формирует функциональный стиль работы с датой и временем.