Класс Zone в Luxon представляет слой абстракции над
часовыми поясами и смещениями времени. Он не хранит дату или время, а
описывает правила интерпретации времени относительно UTC: смещение,
переходы на летнее время, идентификатор зоны и поведение форматирования.
Именно через Zone осуществляется вся работа Luxon с
временными зонами в DateTime.
Внутренняя архитектура построена на полиморфизме: Zone
выступает базовым классом, а конкретные реализации разделяются на
специализированные типы, такие как IANA-зоны, фиксированные смещения и
невалидные зоны.
Любой объект DateTime в Luxon содержит ссылку на
зону:
DateTime.zone — экземпляр Zone
зона определяет:
Таким образом, Zone — это не просто строка вроде
"Europe/Paris", а полноценный объект, способный вычислять
поведение времени в зависимости от timestamp.
Базовый класс Zone является абстрактным и не
используется напрямую. Реальные экземпляры создаются через
подклассы:
Представляет зоны из базы IANA ("Europe/Moscow",
"Asia/Almaty").
Особенности:
Представляет фиксированное смещение от UTC:
"UTC+2", "+0300"Используется при ошибках парсинга зоны:
Основной способ создания зоны из строки.
Поведение:
IANAZoneFixedOffsetZoneInvalidZoneПример логики:
"Europe/London" → IANAZone"+03:00" → FixedOffsetZone"Mars/Phobos" → InvalidZoneСоздаёт экземпляр невалидной зоны.
Используется внутри Luxon при ошибках разбора:
Объект остаётся безопасным для использования: вместо падения
возвращается InvalidZone, который возвращает предсказуемые
значения.
Строковое имя зоны.
"Europe/Berlin"Булево значение, отражающее корректность зоны.
true — IANAZone и FixedOffsetZonefalse — InvalidZoneИспользуется для защиты цепочек вычислений DateTime.
Строковый идентификатор типа зоны:
"iana""fixed""invalid"Позволяет быстро различать стратегию обработки без
instanceof.
Возвращает смещение зоны в минутах для конкретного timestamp.
Сигнатура:
offset(ts: number): number
Параметр ts — Unix-время в миллисекундах.
Особенности:
Пример логики:
Europe/Moscow:
UTC+2: всегда +120 минут
Возвращает человекочитаемое имя смещения или зоны.
Сигнатура:
offsetName(ts: number, options?: object): string
Поведение зависит от реализации:
IANAZone:
"GMT+3", "EET",
"MSK" (если доступны алиасы)FixedOffsetZone:
"+03:00"InvalidZone:
Параметры options позволяют контролировать
форматирование (например, выбор short/long формата через Intl, если
используется системная поддержка).
Форматирует смещение в строку.
Сигнатура:
formatOffset(ts: number, format?: string): string
Типичные форматы:
+03:00+0300Z для UTCПоведение:
+00:00 в
зависимости от контекста LuxonСравнение зон.
Сигнатура:
equals(other: Zone): boolean
Сравнение происходит по логике:
Примеры равенства:
Zone.create("Europe/Moscow") ≠
Zone.create("UTC")FixedOffsetZone(+180) ==
FixedOffsetZone(+180)Возвращает строковое представление зоны.
Формат зависит от типа:
"Europe/Paris""+03:00""InvalidZone"Метод используется при сериализации и логировании объектов DateTime.
IANAZone — наиболее сложная реализация, так как учитывает:
Для каждого timestamp происходит:
Это делает IANAZone динамической относительно времени.
FixedOffsetZone представляет упрощённую модель:
Используется для:
InvalidZone является защитным механизмом Luxon.
Характеристики:
falseИспользуется как результат fallback-логики при парсинге:
Каждый DateTime хранит ссылку на Zone:
DateTime.zone.offset(ts) определяет локальное
времяDateTime.setZone(...) заменяет экземпляр ZoneПример поведения:
toString, toISO)
использует ZoneZone участвует в:
При вызове:
toISO()toFormat()toLocaleString()внутренне используется:
offset(ts)formatOffset(ts)Luxon использует Zone как стратегию вычисления времени:
Это обеспечивает:
Zone выступает центральным элементом между: