Система временных зон базируется на базе данных IANA Time Zone
Database, поддерживаемой Internet Assigned Numbers Authority. Она
определяет стабильные идентификаторы зон вида
Europe/Moscow, Asia/Almaty,
America/New_York, а также правила перехода на летнее и
зимнее время.
Ключевая особенность IANA-модели — отказ от фиксированных смещений в
пользу правил, зависящих от исторических и политических изменений. Одна
и та же временная зона может иметь разные UTC-offset в разные периоды
года.
Поддержка IANA time zone в
Day.js
Библиотека Day.js реализует работу с временными зонами через плагин
timezone, который опирается на IANA-идентификаторы.
Базовая модель Day.js:
- внутреннее хранение времени — UTC
- форматирование — через плагины
- расширение функциональности — через подключаемые модули
Поддержка временных зон не входит в ядро, поскольку стандартный
объект Date в JavaScript ограничен и не предоставляет
полноценного IANA API.
Установка и
подключение timezone-плагина
Для работы с IANA-зонами требуется установка расширений:
npm install dayjs
npm install @js-temporal/polyfill
Дополнительно используется плагин:
npm install dayjs-plugin-utc
npm install dayjs-plugin-timezone
Подключение:
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'
dayjs.extend(utc)
dayjs.extend(timezone)
Базовая работа с IANA зонами
Основной метод работы с временными зонами —
dayjs.tz().
dayjs.tz('2026-01-01 12:00', 'Europe/Moscow')
Разбор:
- первый аргумент — дата/время
- второй аргумент — IANA zone identifier
- результат — объект Day.js, привязанный к указанной зоне
Конвертация времени между
зонами
Перевод UTC во временную
зону
dayjs.utc('2026-01-01 09:00').tz('Asia/Almaty')
Логика:
- исходное время интерпретируется как UTC
- затем применяется смещение зоны
Asia/Almaty
Перевод между локальными
зонами
const moscowTime = dayjs.tz('2026-01-01 12:00', 'Europe/Moscow')
const tokyoTime = moscowTime.tz('Asia/Tokyo')
Поведение:
- сохраняется абсолютный момент времени
- изменяется только представление
Получение текущего времени в
зоне
dayjs().tz('America/New_York')
Особенность:
- системное время конвертируется в указанную IANA-зону
- учитываются правила DST
Форматирование времени с
учётом зоны
dayjs.tz('2026-01-01 12:00', 'Europe/London').format('YYYY-MM-DD HH:mm Z')
Формат:
Z — текущее смещение относительно UTC
- результат зависит от сезона (GMT/BST)
Различие UTC и IANA зон
UTC
- фиксированное смещение +00:00
- отсутствие переходов на летнее время
- удобен для хранения
IANA зоны
- динамическое смещение
- исторические правила
- корректное отображение локального времени
Работа с летним временем
(DST)
IANA база учитывает переходы автоматически.
Пример:
dayjs.tz('2026-07-01 12:00', 'Europe/Berlin')
dayjs.tz('2026-01-01 12:00', 'Europe/Berlin')
Разница:
- летом применяется DST (UTC+2)
- зимой стандартное время (UTC+1)
Парсинг строк в IANA зоне
dayjs.tz('2026-03-10 08:00', 'Asia/Dubai')
Особенность:
- строка интерпретируется не в локальной системе, а в указанной
зоне
- исключаются ошибки смещения при серверном парсинге
Преобразование
в другую зону без изменения момента времени
const time = dayjs.tz('2026-01-01 12:00', 'Europe/Moscow')
const converted = time.tz('Asia/Tokyo')
Семантика:
- абсолютное время сохраняется
- изменяется только отображение
Хранение времени в
приложениях
Типовая схема:
- база данных: UTC
- API: UTC
- клиент: IANA zone rendering
Пример нормализации:
const utcTime = dayjs('2026-01-01 12:00').utc()
Частые ошибки при работе
с IANA зонами
Использование
фиксированных offset вместо IANA
// некорректный подход
dayjs().utcOffset(180)
Проблема:
- не учитываются изменения законодательства
- не работает DST
Двойная конвертация времени
dayjs.tz(dayjs.tz(date, zone), zone)
Результат:
- смещение применяется повторно
- возникает искажение времени
Игнорирование UTC на сервере
Хранение локального времени:
- приводит к расхождению при смене зоны
- усложняет миграции данных
Валидация IANA зон
Day.js не валидирует список зон самостоятельно. Используются строки
формата:
Europe/Moscow
Asia/Almaty
Pacific/Auckland
Некорректная зона:
- приводит к fallback на системную локаль
- может вызвать скрытые ошибки
Производительность при
работе с зонами
Особенности:
- конвертация выполняется на лету
- использование кэширования ускоряет повторные операции
- минимизация цепочек
.tz() снижает нагрузку
Использование на сервере
и в браузере
Сервер (Node.js)
- рекомендуется фиксировать IANA-базу
- синхронизировать версии tzdata
Браузер
- зависит от окружения пользователя
- возможны различия в отображении DST
Комбинация UTC, Day.js и IANA
зон
Типовая модель обработки:
const utc = dayjs.utc('2026-01-01T12:00:00Z')
const local = utc.tz('Asia/Almaty')
Слой преобразования:
- UTC → хранение
- IANA → отображение
- Day.js → вычисления
Работа с
пользовательскими часовыми поясами
function formatForZone(date, zone) {
return dayjs(date).tz(zone).format('YYYY-MM-DD HH:mm')
}
Поведение:
- входное значение нормализуется
- вывод зависит от IANA зоны
Особенности исторических
данных IANA
IANA база содержит:
- изменения политик стран
- переносы часовых поясов
- устаревшие зоны
Пример:
- ранее существовавшие правила для отдельных регионов могут отличаться
от текущих
Итоговая модель
поведения Day.js с IANA
- хранение времени в UTC
- использование IANA для отображения
- применение правил DST автоматически
- изоляция вычислений от локальной системы
- единая семантика временных зон в распределённых приложениях