Текстовое представление временных зон в Js-joda опирается на международные стандарты ISO-8601 и IANA Time Zone Database, объединяя два принципиально разных способа задания смещения и области времени: фиксированные смещения от UTC и именованные региональные зоны с правилами перехода на летнее время.
Временная зона в текстовом виде может быть выражена двумя основными способами:
1. Смещение от UTC (ZoneOffset) Фиксированное смещение задаётся в формате:
Z — нулевое смещение (UTC)+hh:mm-hh:mmПримеры:
Z → UTC+0+03:00 → смещение на 3 часа вперёд-05:00 → смещение на 5 часов назадТакой формат не содержит информации о переходах на летнее время и описывает только постоянную разницу относительно UTC.
2. Именованные зоны (ZoneId) Именованные зоны используют идентификаторы IANA:
Europe/BerlinAsia/AlmatyAmerica/New_YorkЭти строки не являются фиксированными смещениями. Они представляют набор правил, которые могут изменяться во времени: исторические корректировки, политические изменения, переходы на летнее и зимнее время.
В js-joda класс ZoneId является центральной абстракцией
для работы с именованными временными зонами. Он принимает строковое
представление и интерпретирует его как ссылку на правила зоны.
import { ZoneId } from '@js-joda/core';
const zone = ZoneId.of('Europe/Berlin');
Строка 'Europe/Berlin' не содержит числового смещения.
Она ссылается на набор правил, которые определяют:
ZoneOffset представляет собой специализированную форму
зоны, где текстовое представление всегда фиксировано.
import { ZoneOffset } from '@js-joda/core';
const offset = ZoneOffset.of('+02:00');
С точки зрения текстового формата:
ZoneOffset всегда соответствует
±hh:mmВажно различать:
ZoneId.of("+02:00") → создаёт смещение-зонуZoneOffset.of("+02:00") → явно фиксированное
смещениеСтроки временных зон в js-joda проходят нормализацию перед использованием. Это означает:
Примеры нормализации:
utc → UTCgmt → GMTeurope/berlin → Europe/BerlinЕсли строка не соответствует известной зоне или формату смещения, возникает ошибка парсинга.
Текстовое представление может выглядеть похожим, но семантически различается:
| Строка | Тип | Поведение |
|---|---|---|
+03:00 |
ZoneOffset | фиксированное смещение |
Europe/Moscow |
ZoneId | правила + история |
Z |
ZoneOffset | UTC |
Ключевая особенность: одинаковое локальное время может иметь разные UTC-смещения в зависимости от зоны, но не в случае фиксированного offset.
При разборе строк js-joda использует следующие правила:
+ или -,
интерпретируется как ZoneOffsetZ, это UTCZoneIdПример:
ZoneId.of('Z'); // UTC
ZoneId.of('+03:00'); // offset-зона
ZoneId.of('Asia/Tokyo'); // региональная зона
Такой подход позволяет использовать единый API для разных типов представления.
При преобразовании даты-времени в строку временная зона также участвует в формировании итогового значения.
import { ZonedDateTime, ZoneId } from '@js-joda/core';
const zdt = ZonedDateTime.now(ZoneId.of('Europe/Berlin'));
В строковом виде зона может отображаться как:
+02:00 (если используется offset)Europe/Berlin (внутреннее представление)Форматирование обычно опирается на ISO-8601:
2026-05-25T10:15:30+02:002026-05-25T08:15:30ZРазные текстовые представления несут разную семантическую нагрузку:
Offset-формат:
Region ID:
Именованные зоны в js-joda работают только при наличии провайдера
данных временных зон (js-joda-timezone).
Без него:
ZoneId.of('Europe/Berlin') может быть недоступенПосле подключения провайдера строковое представление получает доступ к полной базе IANA:
js-joda приводит строковые идентификаторы к каноническому виду:
europe/london → Europe/Londonasia/karachi → Asia/KarachiЭто важно для обеспечения:
Любая текстовая зона в конечном итоге преобразуется в набор правил, которые позволяют вычислить UTC-смещение для конкретного момента времени.
Пример логики:
Europe/Moscow в 2020 году → UTC+3В случае +03:00 значение всегда фиксировано независимо
от даты.
При сохранении времени с зоной часто используется текстовая форма:
Типичные варианты:
2026-05-25T12:00:00+03:00{ "zone": "Europe/Berlin" }Разделение времени и зоны в текстовом виде позволяет гибко управлять интерпретацией данных.
Сравнение строк в js-joda не всегда означает равенство поведения:
+02:00 ≠ Europe/BerlinЭто различие критично при:
Текстовая форма зоны не содержит:
Она является лишь ключом к набору правил, а не самими правилами.
Внутренние системы времени обычно опираются на текстовое представление зон в следующих случаях:
В этих сценариях различие между ZoneId и
ZoneOffset становится критически важным для корректной
интерпретации времени в разных контекстах.