В Intl календарная система является частью более широкой
модели локализации дат и времени. Базовая точка входа —
Intl.DateTimeFormat, где календарь задаётся через опцию
calendar. Это позволяет форматировать одну и ту же дату в
разных календарных системах без ручных преобразований.
const dtf = new Intl.DateTimeFormat('ru', {
calendar: 'chinese',
dateStyle: 'full'
});
dtf.format(new Date());
Календарь chinese относится к лунно-солнечным
календарным системам и отличается от григорианского не только
отображением, но и логикой вычисления года, месяца и цикла.
Китайский календарь — это традиционная система летоисчисления,
основанная на сочетании лунных месяцев и солнечных корректировок. В
JavaScript он представлен как один из стандартных идентификаторов
календарей ICU (chinese).
В рамках Intl он не требует ручной реализации астрономии
или вычислений циклов: движок использует ICU (International Components
for Unicode), где уже реализована вся логика преобразования дат.
Ключевая особенность: одна и та же григорианская дата может соответствовать разным значениям года/месяца/дня в китайской системе.
const formatter = new Intl.DateTimeFormat('zh-Hans', {
calendar: 'chinese',
year: 'numeric',
month: 'long',
day: 'numeric'
});
formatter.format(new Date());
Здесь локаль zh-Hans усиливает соответствие культурному
контексту, но сам календарь задаётся отдельно.
const short = new Intl.DateTimeFormat('ru', {
calendar: 'chinese',
dateStyle: 'short'
});
const full = new Intl.DateTimeFormat('ru', {
calendar: 'chinese',
dateStyle: 'full'
});
dateStyle влияет только на представление, но не на
календарную систему.
Григорианский календарь (gregory) в Intl — это стандарт
по умолчанию. Он линейный и основан на солнечном цикле.
Китайский календарь (chinese) является циклическим и
включает:
В результате:
new Intl.DateTimeFormat('en', { calendar: 'gregory' }).format(new Date());
new Intl.DateTimeFormat('en', { calendar: 'chinese' }).format(new Date());
выведут разные структурные представления одной и той же даты.
Метод formatToParts позволяет получить не строку, а
структурированное представление.
const parts = new Intl.DateTimeFormat('en', {
calendar: 'chinese',
year: 'numeric',
month: 'numeric',
day: 'numeric'
}).formatToParts(new Date());
Результат содержит компоненты:
yearmonthdayliteralОсобенность китайского календаря в том, что year может
отражать циклическое значение, а не привычный линейный год.
Календарь может быть частью описания локали через
Intl.Locale:
const locale = new Intl.Locale('zh-CN', {
calendar: 'chinese'
});
locale.calendar;
Это важно при построении интерфейсов, где локаль передаётся как объект конфигурации, а не строка.
Список доступных календарей можно получить через:
Intl.supportedValuesOf('calendar');
Среди стандартных значений обычно присутствуют:
gregorychinesejapaneseislamichebrewbuddhistНаличие chinese означает поддержку лунно-солнечной
модели ICU, используемой в международной локализации.
При использовании calendar: 'chinese' важно учитывать
несколько особенностей поведения:
Год не совпадает с григорианским. Он определяется циклом и может «перекрывать» границы привычного года.
Месяцы зависят от лунных фаз, поэтому их длина варьируется.
Некоторые годы содержат дополнительный месяц, который не имеет прямого аналога в григорианской системе.
const d = new Date(2026, 0, 1);
const fmt = new Intl.DateTimeFormat('zh-Hans', {
calendar: 'chinese',
year: 'numeric',
month: 'long',
day: 'numeric'
});
fmt.format(d);
new Intl.DateTimeFormat('zh-Hans', {
calendar: 'chinese',
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(new Date());
Локаль влияет на язык названий месяцев и дней недели, но не на календарную логику.
const date = new Date();
new Intl.DateTimeFormat('en', { calendar: 'chinese' }).format(date);
new Intl.DateTimeFormat('ru', { calendar: 'chinese' }).format(date);
new Intl.DateTimeFormat('zh-Hans', { calendar: 'chinese' }).format(date);
Различия проявляются в:
Китайский календарь совместим со всеми основными опциями:
yearmonthdayweekdayhour, minute, secondtimeZonenew Intl.DateTimeFormat('zh-Hans', {
calendar: 'chinese',
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
timeZone: 'Asia/Shanghai'
}).format(new Date());
Intl не изменяет исходный объект Date. Он всегда хранит
время в формате Unix timestamp. Календарная система применяется только
на этапе форматирования.
Это означает:
DateКалендарь chinese в Intl имеет ряд архитектурных
ограничений:
Вся работа идёт через ICU-слой форматирования.
В рамках Intl китайский календарь отличается от других систем:
gregory — линейная солнечная модельislamic — лунный календарь с религиозной привязкойhebrew — лунно-солнечный календарь с фиксированными
правилами вставокchinese — циклический лунно-солнечный календарь с
60-летним цикломКлючевое отличие chinese — наличие циклической нумерации
лет, не являющейся просто счётом от фиксированной точки.
Поддержка calendar: 'chinese' зависит от ICU версии
внутри среды выполнения:
При разработке интерфейсов с критичной локализацией это учитывается через feature detection:
Intl.supportedValuesOf('calendar').includes('chinese');