Работа с IANA timezone

Система временных зон базируется на базе данных 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 автоматически
  • изоляция вычислений от локальной системы
  • единая семантика временных зон в распределённых приложениях