API интернационализации ECMAScript (Intl) предоставляет
единый механизм форматирования дат и времени с учётом культурных и
региональных различий. Одним из ключевых аспектов является поддержка
альтернативных календарей, среди которых буддийский календарь
используется в ряде стран Юго-Восточной Азии и представляет собой
надстройку над григорианской системой с иной системой
летоисчисления.
Буддийский календарь в JavaScript не является отдельной моделью
времени: он реализуется как режим отображения поверх стандартного
Date, где меняется только представление года и эпохи, но не
внутренняя временная модель.
Intl и роль календарейВнутренне JavaScript использует Unix-время
(timestamp) — количество миллисекунд с 1 января 1970 года UTC.
Объект Date не хранит календарную систему, а лишь
абсолютный момент времени.
Intl.DateTimeFormat накладывает на этот момент времени
правила форматирования:
Календарь является частью Unicode Locale Identifier и может быть задан через:
calendaru-ca в строке локалиБуддийский календарь, используемый в JavaScript через
Intl, соответствует Thai Buddhist Era
(BE).
Его ключевая особенность:
год смещён относительно григорианского на +543 года
например:
Это не альтернативная система времени, а альтернативное представление года.
calendarconst formatter = new Intl.DateTimeFormat('th-TH', {
calendar: 'buddhist',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(formatter.format(new Date()));
В этом случае локаль может быть любой, но чаще используется
th-TH, поскольку тайский язык исторически связан с
буддийским летоисчислением.
u-ca-buddhistconst formatter = new Intl.DateTimeFormat('th-TH-u-ca-buddhist');
console.log(formatter.format(new Date()));
Здесь календарь задаётся как часть BCP 47-тега локали:
th-TH — базовая локальu-ca-buddhist — Unicode extension (calendar =
buddhist)Этот способ считается предпочтительным, когда требуется компактная и декларативная настройка локали.
const date = new Date('2026-01-01');
const fmtGregorian = new Intl.DateTimeFormat('th-TH', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
const fmtBuddhist = new Intl.DateTimeFormat('th-TH', {
calendar: 'buddhist',
year: 'numeric',
month: 'long',
day: 'numeric'
});
fmtGregorian.format(date);
fmtBuddhist.format(date);
Результат иллюстрирует ключевую особенность: различие только в годе и обозначении эпохи, при неизменной дате.
Intl.DateTimeFormat использует набор опций, которые
остаются неизменными независимо от календаря:
year: "numeric" |
"2-digit"month: "numeric" | "2-digit"
| "long" | "short" |
"narrow"day: "numeric" |
"2-digit"hour, minute, secondtimeZoneweekdayКалендарь влияет только на интерпретацию года и иногда на локальные правила отображения дат.
Локаль определяет языковое оформление результата:
new Intl.DateTimeFormat('th-TH-u-ca-buddhist', {
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(new Date());
Для th-TH результат будет на тайском языке с буддийским
летоисчислением.
Если заменить локаль:
new Intl.DateTimeFormat('en-US-u-ca-buddhist', {
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(new Date());
то формат останется буддийским, но язык будет английским, а стиль отображения адаптируется под региональные правила США.
В буддийской системе используется собственная эпоха:
AD (Anno Domini)BE (Buddhist Era)Intl автоматически подставляет корректную эпоху при
выборе календаря.
const fmt = new Intl.DateTimeFormat('th-TH-u-ca-buddhist', {
year: 'numeric'
});
fmt.format(new Date('2026-01-01'));
Вывод будет содержать год 2569 BE.
Intl опирается на Unicode Calendar Identifier. Среди
доступных календарей:
gregorybuddhistjapaneseislamichebrewchinesepersianindianДля проверки поддержки в среде используется:
Intl.supportedValuesOf('calendar');
Если buddhist присутствует, форматирование с этим
календарём гарантированно поддерживается.
Календарь применяется ко всем компонентам даты:
const fmt = new Intl.DateTimeFormat('th-TH-u-ca-buddhist', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric'
});
Результат включает:
Intl при работе с буддийским календарёмНесмотря на поддержку календарей, существуют фундаментальные ограничения:
Intl не изменяет внутренний тип DateIntlТаким образом:
Поскольку буддийский календарь — это смещение:
new Intl.DateTimeFormat('th-TH-u-ca-buddhist', {
year: 'numeric'
}).format(new Date(0));
Это подчёркивает, что система не имеет собственного “начала времени”, а лишь отображает другую шкалу лет.
Календарь можно комбинировать с любыми форматами:
new Intl.DateTimeFormat('th-TH-u-ca-buddhist', {
dateStyle: 'full',
timeStyle: 'long',
timeZone: 'Asia/Bangkok'
});
Комбинация:
dateStyle/timeStyle задаёт уровень детализацииcalendar задаёт систему летоисчисленияtimeZone фиксирует локальное времяЕсли календарь задан двумя способами:
new Intl.DateTimeFormat('th-TH-u-ca-buddhist', {
calendar: 'gregory'
});
приоритет имеет явный параметр calendar, а не расширение
локали.
Это важно при динамической генерации настроек форматирования.
Реализация зависит от движка:
Хотя спецификация едина, список поддерживаемых календарей может отличаться. Однако буддийский календарь входит в базовый набор Unicode CLDR и поддерживается практически повсеместно.
Буддийский календарь в Intl используется там, где
требуется:
Календарь не влияет на:
Date-объекты сравниваются по
timestamp)Он влияет исключительно на строковое представление результата форматирования.
new Date('2026-01-01') > new Date('2025-01-01'); // true
Этот результат одинаков для всех календарей.
IntlDate)