В JavaScript календарная система задаётся через параметр
calendar, который входит в состав локали или передаётся
через объект options в форматерах
Intl.DateTimeFormat, Intl.RelativeTimeFormat,
а также в ряде других API, связанных с датами.
Календарь определяет правила разбиения времени на годы, месяцы и дни,
а также способ вычисления этих значений. Стандартная система в
большинстве окружений — григорианская (gregory), однако
ICU-реализация Intl поддерживает множество альтернативных
календарей.
Наиболее распространённые значения параметра
calendar:
gregory — григорианский календарь (де-факто
стандарт)iso8601 — календарь ISO, основанный на неделяхbuddhist — буддийский календарь (используется в
Таиланде)chinese — традиционный китайский календарьcoptic — коптский календарьethiopic — эфиопские календарные системыhebrew — еврейский календарьindian — индийский национальный календарьislamic / islamic-umalqura /
islamic-civil — исламские календари с различными
алгоритмами расчётаpersian — персидский календарьКаждая система влияет на вычисление года, месяца и даже структуру месяцев.
Календарь задаётся через локаль с Unicode extension или через опции форматирования.
const date = new Date();
const fmt = new Intl.DateTimeFormat("en-u-ca-islamic", {
year: "numeric",
month: "long",
day: "numeric"
});
fmt.format(date);
В данном примере:
u-ca-islamic включает исламский календарьen определяет язык выводаconst fmt = new Intl.DateTimeFormat("ar", {
calendar: "islamic-umalqura",
year: "numeric",
month: "2-digit",
day: "2-digit"
});
fmt.format(new Date());
Параметр calendar напрямую работает не во всех
окружениях одинаково, но при поддержке ICU он переопределяет календарную
систему.
Формат Unicode extension позволяет комбинировать параметры локали:
language[-script][-region]-u-ca-calendar
Примеры:
en-u-ca-gregoryar-u-ca-islamicfa-u-ca-persiannew Intl.DateTimeFormat("fa-u-ca-persian").format(new Date());
Календарь влияет на:
Например:
| Система | Особенности |
|---|---|
| gregory | 12 месяцев, фиксированная структура |
| islamic | лунный календарь, год короче |
| chinese | циклическая система с високосными месяцами |
| hebrew | лунно-солнечная система |
Intl.DateTimeFormat — основной инструмент работы с
календарями.
const fmtGregorian = new Intl.DateTimeFormat("en-u-ca-gregory", {
year: "numeric",
month: "long",
day: "numeric"
});
const fmtHijri = new Intl.DateTimeFormat("en-u-ca-islamic", {
year: "numeric",
month: "long",
day: "numeric"
});
const date = new Date();
fmtGregorian.format(date);
fmtHijri.format(date);
Обе строки представляют одну и ту же дату, но в разных календарных системах.
Метод formatToParts позволяет разобрать календарное
представление на компоненты:
const fmt = new Intl.DateTimeFormat("en-u-ca-islamic", {
year: "numeric",
month: "long",
day: "numeric"
});
fmt.formatToParts(new Date());
Результат:
[
{ type: "month", value: "Rabi' I" },
{ type: "day", value: "12" },
{ type: "year", value: "1446" }
]
Календарь напрямую влияет на структуру этих частей.
Intl.Calendar предоставляет низкоуровневый доступ к
календарным вычислениям. Поддержка зависит от окружения, но в
современных реализациях на базе ICU он доступен.
const cal = new Intl.Calendar("islamic");
Поддерживаемые идентификаторы соответствуют Unicode CLDR.
Создание даты из календарных полей:
const cal = new Intl.Calendar("gregory");
cal.dateFromFields({
year: 2025,
month: 5,
day: 26
});
const cal = new Intl.Calendar("islamic");
const date = new Date();
cal.fields(date);
Результат содержит календарно-зависимые значения.
Разные календари по-разному интерпретируют:
Например, в исламском календаре год примерно на 10–11 дней короче солнечного года, что приводит к смещению дат относительно григорианской системы.
Помимо календарей, Intl API поддерживает настройку системы счисления
через параметр numberingSystem.
latn — латинские цифры (0–9)arab — арабские цифрыarabext — расширенные арабские цифрыdeva — деванагариbeng — бенгальская системаthai — тайская системаhebr — еврейская системаfullwide — полноширинные символыconst nf = new Intl.NumberFormat("ar-u-nu-arab", {
numberingSystem: "arab"
});
nf.format(123456);
Аналогично календарям, система счисления задаётся через
nu:
en-u-nu-latnar-u-nu-arabhi-u-nu-devanew Intl.NumberFormat("hi-u-nu-deva").format(12345);
Результат будет отображён в деванагари-цифрах.
Календарь и система счисления работают независимо, но часто используются вместе в локалях.
const fmt = new Intl.DateTimeFormat("ar-u-ca-islamic-nu-arab", {
year: "numeric",
month: "long",
day: "numeric"
});
fmt.format(new Date());
В данном случае:
Поддержка календарей и систем счисления зависит от ICU-библиотеки, встроенной в среду выполнения JavaScript.
Различия могут включать:
Проверка доступности:
Intl.supportedValuesOf("calendar");
Intl.supportedValuesOf("numberingSystem");
Unicode extension позволяет комбинировать параметры:
language-u-ca-calendar-nu-numberingSystem
Примеры:
en-u-ca-buddhist-nu-thaith-u-ca-buddhist-nu-thaiar-u-ca-islamic-nu-arabextnew Intl.DateTimeFormat("th-u-ca-buddhist-nu-thai").format(new Date());
Такие комбинации обеспечивают полную локализацию даты и чисел.
В разных календарях:
new Intl.DateTimeFormat("th-u-ca-buddhist", {
year: "numeric",
month: "long"
}).format(new Date());
Год будет смещён относительно григорианского на 543 года.
При работе с Intl.Calendar и форматерами происходит
нормализация:
const cal = new Intl.Calendar("persian");
const fields = cal.fields(new Date());
Результат отражает персидскую систему летоисчисления.
Intl.Calendar может отличаться между
движкамиca и nu игнорируются
fallback-локальюПри этом Intl.DateTimeFormat остаётся основным
стабильным инструментом работы с календарями и числовыми системами в
JavaScript.