В современной экосистеме JavaScript работа с локализацией и форматированием данных опирается на стандарт ECMA-402, известный как Intl API. Он предоставляет набор объектов для преобразования дат, чисел, валют и строк в формат, соответствующий конкретной языковой и региональной зоне.
Под «зоной» в контексте Intl понимается совокупность параметров отображения: часовой пояс, календарная система, числовой формат, порядок компонентов даты, а также культурные правила округления и группировки. Взаимодействие этих параметров определяет конечное представление данных пользователю.
Каждый форматтер в Intl строится вокруг двух ключевых сущностей:
en-US, ru-RU,
ar-EG)Идентификатор локали задаёт базовые правила отображения, а параметры уточняют поведение.
new Intl.DateTimeFormat("ru-RU", { timeZone: "Europe/Moscow" });
Локаль влияет на порядок элементов, разделители, названия месяцев, систему счисления. Зона времени влияет на вычисление самой даты.
Ключевым механизмом работы с зонами является параметр
timeZone.
const formatter = new Intl.DateTimeFormat("en-GB", {
timeZone: "Europe/London",
dateStyle: "full",
timeStyle: "long"
});
Параметр timeZone принимает IANA-идентификаторы:
UTCEurope/ParisAsia/AlmatyAmerica/New_YorkБез указания зоны используется локальная зона окружения выполнения (браузера или Node.js).
Один и тот же timestamp интерпретируется по-разному:
const date = new Date("2026-01-01T12:00:00Z");
new Intl.DateTimeFormat("en-US", {
timeZone: "America/New_York",
timeStyle: "short"
}).format(date);
new Intl.DateTimeFormat("en-US", {
timeZone: "Asia/Tokyo",
timeStyle: "short"
}).format(date);
Разница формируется исключительно за счёт смещения часового пояса.
Intl учитывает не только явный timeZone, но и
дополнительные параметры:
hour12 / hourCycledayPeriodФорматирование чисел также зависит от зоны отображения, хотя напрямую не использует часовые пояса.
new Intl.NumberFormat("de-DE").format(1234567.89);
Результат зависит от:
Параметр numberingSystem позволяет переключать систему
записи чисел:
new Intl.NumberFormat("ar-EG-u-nu-arab").format(123456);
Системы включают:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD"
}).format(1234.5);
Формат валюты зависит от локали:
Одно и то же значение отображается по-разному:
en-US: $1,234.50de-DE: 1.234,50 $ja-JP: ¥1,235Форматирование определяется комбинацией locale + currencyDisplay + rounding rules.
Intl поддерживает разные календарные системы:
new Intl.DateTimeFormat("ar-SA-u-ca-islamic", {
timeZone: "Asia/Riyadh"
});
Календарь влияет на:
Часовой пояс определяет физическое время, календарь — его интерпретацию.
При комбинации:
timeZone → вычисляет момент времениcalendar → отображает структуру датыЛокаль задаёт сразу несколько слоёв поведения:
new Intl.DateTimeFormat("he-IL", {
timeZone: "Asia/Jerusalem"
});
Для арабских и ивритских локалей дополнительно включаются правила:
Используется для отображения времени относительно текущего момента:
new Intl.RelativeTimeFormat("ru-RU").format(-1, "day");
Зоны здесь не участвуют напрямую, но локаль влияет на грамматику:
new Intl.DateTimeFormat("en-US", {
hour: "2-digit",
hourCycle: "h23"
});
Возможные варианты:
h12 — 12-часовой форматh23 — 24-часовой формат без повторения 0–23h11, h24 — альтернативные системыВыбор зависит от локали, но может быть переопределён.
Компоненты даты позволяют гибко строить формат:
new Intl.DateTimeFormat("en-CA", {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
timeZone: "Asia/Shanghai"
});
Комбинация этих параметров создаёт локализованное представление даты.
Intl использует алгоритм:
Пример:
fr-CA → fr → en-USЛокали могут содержать расширения -u-, задающие
дополнительные параметры:
"en-US-u-ca-buddhist-nu-arab"
Поддерживаются ключи:
ca — календарьnu — система чиселhc — часовой циклtz — часовой пояс (в некоторых реализациях)Эти параметры позволяют кодировать «зону форматирования» внутри самой строки локали.
Результаты Intl зависят от среды:
Это приводит к тому, что одна и та же локаль может иметь отличия:
В реальных сценариях используется несколько форматтеров одновременно:
DateTimeFormat — дата и времяNumberFormat — числа и валютыRelativeTimeFormat — относительные интервалыКаждый из них учитывает локаль, но имеет собственную модель параметров.
Intl отделяет вычисление данных от их представления:
Это позволяет переключать отображение без изменения данных, сохраняя единый источник истины.