Календарная система в контексте ECMAScript Internationalization API определяет правила интерпретации дат: как разбиваются годы, месяцы, дни, какие используются эпохи и какие исторические или религиозные системы летоисчисления применяются. Встроенная локализация JavaScript опирается на ICU (International Components for Unicode), где календарь является частью расширенных параметров локали.
Календарь влияет не на хранение времени в JavaScript (оно всегда основано на Unix time — миллисекундах с эпохи 1970-01-01 UTC), а на представление даты.
В Intl.DateTimeFormat календарь задаётся через
расширение локали или через параметр calendar.
Пример логики:
Календарь — это часть Unicode Locale Identifier:
en-US-u-ca-gregory
ar-SA-u-ca-islamic
ja-JP-u-ca-japanese
Здесь ca (calendar) — ключ расширения Unicode.
Большинство локалей по умолчанию используют григорианский календарь
(gregory).
const fmt = new Intl.DateTimeFormat("en-US", {
calendar: "gregory"
});
fmt.format(new Date(2026, 0, 1));
Григорианская система:
Если календарь не указан, Intl выбирает его
автоматически на основе локали.
Список поддерживаемых календарей можно получить через:
Intl.supportedValuesOf("calendar");
Типичный набор (зависит от реализации ICU):
gregorybuddhistchinesecopticethiopichebrewindianislamicislamic-umalquraislamic-civilislamic-tblajapanesepersianrocКаждая система определяет:
Календарь можно задавать через Unicode extension в строке локали:
const fmt = new Intl.DateTimeFormat("ar-SA-u-ca-islamic");
или:
const fmt = new Intl.DateTimeFormat("ja-JP-u-ca-japanese");
Такой подход важнее, чем опция calendar, потому что он
влияет не только на календарь, но и на сопутствующие культурные
настройки.
Исламские календари основаны на лунных циклах, что приводит к смещению дат относительно солнечного года.
islamic — табличный вариантislamic-umalqura — официальный календарь Саудовской
Аравииislamic-civil — гражданская версияislamic-tbla — табличный алгоритмПример:
const fmt = new Intl.DateTimeFormat("ar-SA-u-ca-islamic-umalqura", {
year: "numeric",
month: "long",
day: "numeric"
});
Особенности:
Японский календарь (japanese) основан на эпохах
императоров (nengō).
Пример:
const fmt = new Intl.DateTimeFormat("ja-JP-u-ca-japanese");
fmt.format(new Date(2026, 0, 1));
Структура:
Особенность:
Используется в Таиланде и некоторых странах Юго-Восточной Азии.
const fmt = new Intl.DateTimeFormat("th-TH-u-ca-buddhist");
Особенности:
Лунно-солнечная система:
const fmt = new Intl.DateTimeFormat("he-IL-u-ca-hebrew");
Особенности:
const fmt = new Intl.DateTimeFormat("zh-CN-u-ca-chinese");
Особенности:
const fmt = new Intl.DateTimeFormat("fa-IR-u-ca-persian");
Особенности:
Любой форматтер можно проанализировать:
const fmt = new Intl.DateTimeFormat("en-US-u-ca-islamic");
fmt.resolvedOptions();
Результат включает:
calendarlocaletimeZonenumberingSystemЭто ключевой способ определить, какой календарь фактически используется.
Календарь влияет на:
Пример:
const fmt = new Intl.DateTimeFormat("ja-JP-u-ca-japanese", {
era: "long",
year: "numeric",
month: "long",
day: "numeric"
});
В результате может появиться:
Система выбора календаря работает по приоритетам:
calendar в options-u-ca-Пример:
new Intl.DateTimeFormat("en-US", {
calendar: "buddhist"
});
перекрывает:
new Intl.DateTimeFormat("en-US-u-ca-gregory");
Не все календарные системы равнозначны:
Важно:
Date не поддерживает альтернативные календари внутри
себяХотя Temporal API ещё не является полностью унифицированным во всех окружениях, его модель напрямую учитывает календарные системы:
PlainDateCalendar как отдельная сущностьЭто усиливает роль календарей как независимого слоя поверх временной шкалы.
formatToParts показывает влияние календаря на
структуру:
const fmt = new Intl.DateTimeFormat("ar-SA-u-ca-islamic", {
year: "numeric",
month: "long",
day: "numeric"
});
fmt.formatToParts(new Date());
Части могут включать:
Но значения года и месяца уже преобразованы в соответствии с календарём.
Календарные системы в Intl работают как слой трансформации:
timestamp → Gregorian breakdown → calendar conversion → localized formatting
Из этого следуют ключевые свойства:
Календарь может комбинироваться с другими параметрами:
ja-JP-u-ca-japanese-nu-arab
где:
ca — календарьnu — система чиселПример:
new Intl.DateTimeFormat("ja-JP-u-ca-japanese-nu-jpan");
Это позволяет одновременно менять:
Если указанный календарь не поддерживается:
gregoryЭто гарантирует стабильность API.
Календарные системы обеспечивают:
Intl API скрывает сложность преобразований, предоставляя унифицированную модель форматирования поверх множества календарных логик.