В международных API JavaScript работа с временем строится вокруг двух принципиально разных моделей представления часовых поясов: фиксированные смещения относительно UTC и именованные зоны, определяемые базой IANA. Эти два подхода выглядят похоже на уровне вывода даты, но ведут себя существенно по-разному при форматировании, сравнении и учёте перехода на летнее время.
Смещение (UTC offset) представляет собой фиксированную разницу между локальным временем и универсальным координированным временем.
Формат записи обычно выглядит так:
+03:00-05:00+00:00 (UTC)Фиксированное смещение обладает следующими свойствами:
Пример логики:
UTC 12:00 + 03:00 = локальное время 15:00
Смещение удобно для:
Именованная зона определяется через базу IANA Time Zone Database и выглядит как строковый идентификатор:
Europe/MoscowAsia/AlmatyAmerica/New_YorkEurope/BerlinВ отличие от offset, именованная зона содержит не только смещение, но и правила его изменения во времени.
Например, зона Europe/Berlin может иметь разные смещения
в разные месяцы года:
Основной механизм работы с часовыми поясами в Intl API —
Intl.DateTimeFormat.
new Intl.DateTimeFormat("en-US", {
timeZone: "Europe/Berlin",
dateStyle: "full",
timeStyle: "long"
}).format(new Date());
Здесь используется полная семантика региона, включая правила DST.
JavaScript не принимает произвольные offset-строки напрямую в
timeZone. Однако существует специальная зона:
UTCnew Intl.DateTimeFormat("en-US", {
timeZone: "UTC",
timeStyle: "long"
}).format(new Date());
Для имитации offset часто используются:
timeZoneName.Intl.DateTimeFormat поддерживает вывод информации о
смещении через timeZoneName.
Основные значения:
short → компактное обозначениеlong → полное описаниеshortOffset → краткое смещение (например, GMT+3)longOffset → полное смещение (например, GMT+03:00)Пример:
new Intl.DateTimeFormat("en-US", {
timeZone: "Europe/Berlin",
timeZoneName: "shortOffset",
hour: "2-digit",
minute: "2-digit"
}).format(new Date());
Вывод может содержать:
GMT+1GMT+2 (в зависимости от сезона)В Intl API встречаются оба обозначения:
На практике:
Важно учитывать, что:
GMT+3 в Intl — это именно отображение;Фиксированные смещения имеют ряд специфических ограничений при использовании в экосистеме Jav * aScript:
Любая дата интерпретируется одинаково:
2020-01-01 12:00 +03:00
2026-01-01 12:00 +03:00
Фактическая локальная реальность не учитывается.
Смещение не позволяет определить:
Одинаковое смещение может соответствовать десяткам разных зон:
+03:00 → Москва, Минск (исторически), Эр-Рияд и
др.Именованные зоны обеспечивают:
new Intl.DateTimeFormat("en-US", {
timeZone: "America/New_York",
timeZoneName: "long"
}).format(new Date());
В зависимости от даты:
Метод resolvedOptions() позволяет получить фактически
применённые параметры:
const dtf = new Intl.DateTimeFormat("en-US", {
timeZone: "Asia/Almaty"
});
dtf.resolvedOptions();
Результат содержит:
timeZonelocaleЭто важно для понимания того, какая зона была реально выбрана движком.
Современные реализации Intl используют IANA базу зон.
Получение списка:
Intl.supportedValuesOf("timeZone");
Типичный набор включает:
Europe/ParisAsia/TokyoAmerica/Los_AngelesAsia/AlmatyЧасто используется комбинированный подход:
Часто применяются:
2026-05-26T12:00:00+03:00);Z);Проблема:
JavaScript Date всегда хранит момент времени в UTC,
поэтому:
timeZone: "+03:00" // не поддерживается
Допустимы только IANA зоны и UTC.
Intl API работает поверх ECMAScript Date, где:
Это означает, что:
| Модель | Характер | DST | История | Контекст |
|---|---|---|---|---|
| Offset | фиксированный сдвиг | нет | нет | отсутствует |
| Named zone | региональные правила | да | да | полный |
При использовании Intl.DateTimeFormat:
Пример различия:
new Intl.DateTimeFormat("en-US", {
timeZone: "UTC",
timeZoneName: "shortOffset"
});
vs
new Intl.DateTimeFormat("en-US", {
timeZone: "Asia/Almaty",
timeZoneName: "short"
});
В первом случае — чистое смещение, во втором — региональная интерпретация.
В IANA базе присутствуют зоны вида:
Etc/GMT+3Etc/GMT-3Особенность:
Etc/GMT+3 соответствует UTC−03:00.Это часто становится источником ошибок при ручной интерпретации.
Внутри Intl API взаимодействие можно представить так:
Эта модель позволяет одновременно поддерживать: