В JavaScript объект Date всегда хранит момент времени
как количество миллисекунд с эпохи Unix (UTC). Календарь в
Intl не изменяет внутреннее представление даты, а влияет
только на способ её интерпретации и отображения.
Поддерживаются различные календарные системы: григорианская (по умолчанию), исламские варианты, буддийский, японский и другие. Все они работают поверх одного и того же временного значения, но по-разному отображают год, месяц и день.
Ключевая особенность:
Date не «переводится» в другой календарьКалендарь может быть задан через Unicode extension в строке локали:
const locale = "en-US-u-ca-islamic";
Фрагмент u-ca-islamic указывает календарную систему:
ca — calendarislamic — исламский календарьПример использования:
const date = new Date("2026-01-01T00:00:00Z");
console.log(new Intl.DateTimeFormat("en-US-u-ca-gregory").format(date));
console.log(new Intl.DateTimeFormat("en-US-u-ca-islamic").format(date));
Обе строки используют один и тот же Date, но вывод будет
различаться из-за календарной системы.
Второй способ задания календаря — через опции форматтера:
const formatter = new Intl.DateTimeFormat("en-US", {
calendar: "islamic"
});
console.log(formatter.format(new Date()));
Этот вариант эквивалентен использованию Unicode extension, но даёт более явный контроль в коде.
Часто используемые значения calendar:
gregory — григорианский календарь (по умолчанию)islamic — исламский (обобщённый)islamic-umalqura — исламский календарь Умм
аль-Кураbuddhist — буддийский календарьjapanese — японская система эрПример:
const calendars = ["gregory", "buddhist", "japanese"];
const date = new Date("2026-05-27T00:00:00Z");
for (const cal of calendars) {
const f = new Intl.DateTimeFormat("en-US", {
calendar: cal,
year: "numeric",
month: "long",
day: "numeric"
});
console.log(cal, "->", f.format(date));
}
Календарная система в Intl не изменяет момент времени.
Это не арифметическая конвертация между календарями, а отображение
одного и того же timestamp в разных системах.
Например:
const date = new Date("2026-05-27T12:00:00Z");
Этот момент:
Календарь тесно связан с локалью:
const f1 = new Intl.DateTimeFormat("ar-SA", {
calendar: "islamic"
});
const f2 = new Intl.DateTimeFormat("ar-SA", {
calendar: "gregory"
});
console.log(f1.format(new Date()));
console.log(f2.format(new Date()));
Даже при одинаковой локали результат может радикально отличаться, поскольку:
Intl.Locale позволяет извлечь информацию о
календаре:
const loc = new Intl.Locale("en-US-u-ca-buddhist");
console.log(loc.calendar); // "buddhist"
Это полезно для:
Типичный сценарий — динамическое переключение календарной системы:
function format(date, calendar) {
return new Intl.DateTimeFormat("en-US", {
calendar,
year: "numeric",
month: "long",
day: "numeric"
}).format(date);
}
const date = new Date("2026-05-27T00:00:00Z");
console.log(format(date, "gregory"));
console.log(format(date, "islamic-umalqura"));
console.log(format(date, "buddhist"));
Здесь одна дата отображается в трёх календарных системах без
каких-либо преобразований самого объекта Date.
Механизм календарей в Intl имеет ряд принципиальных
ограничений:
Невозможно получить Date из строки, сформированной в
другом календаре:
const formatted = new Intl.DateTimeFormat("ar-SA-u-ca-islamic").format(new Date());
// обратно в Date стандартными средствами Intl это не конвертируется
Intl не предоставляет API для:
Он работает только на уровне форматирования.
Внутренняя модель можно описать так:
Date хранит абсолютный момент времени
Intl.DateTimeFormat получает этот момент
календарь определяет правила разбиения времени на:
результат формируется как строка
Локаль может содержать сразу несколько расширений:
const locale = "ar-SA-u-ca-islamic-nu-latn";
Где:
ca-islamic — календарьnu-latn — система чисел (латинские цифры)Использование:
const f = new Intl.DateTimeFormat(locale, {
year: "numeric",
month: "long",
day: "numeric"
});
console.log(f.format(new Date()));
Если календарь не поддерживается окружением:
gregoryПример:
new Intl.DateTimeFormat("en-US", {
calendar: "unknown-calendar"
}).format(new Date());
Результат зависит от реализации движка, но обычно система игнорирует неизвестное значение.
const date = new Date("2026-05-27T00:00:00Z");
const options = { year: "numeric", month: "long", day: "numeric" };
const greg = new Intl.DateTimeFormat("en-US-u-ca-gregory", options);
const islam = new Intl.DateTimeFormat("en-US-u-ca-islamic", options);
const japan = new Intl.DateTimeFormat("en-US-u-ca-japanese", options);
console.log(greg.format(date));
console.log(islam.format(date));
console.log(japan.format(date));
Каждый форматтер использует:
Календарная система влияет на:
В системах с несколькими календарями важно: