В экосистеме FormatJS работа с датами строится на базе стандарта ECMA-402 (Intl API) и данных CLDR (Common Locale Data Repository). Календарная система в этом контексте определяет не только формат отображения даты, но и саму модель исчисления времени: начало эпохи, структуру года, месяцы, правила нумерации и особенности локализации.
Календарная система влияет на то, как интерпретируются значения года, месяца и дня. В зависимости от локали одна и та же дата может быть представлена по-разному:
В JavaScript календарь задаётся через параметр calendar
в Intl.DateTimeFormat.
new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric',
calendar: 'gregory'
}).format(new Date());
Большинство библиотек интернационализации, включая FormatJS, опираются на данные CLDR. Именно CLDR определяет список доступных календарных систем:
Каждый календарь не просто изменяет отображение года, но и использует собственную систему вычисления дат.
Григорианский календарь является дефолтным для большинства локалей и платформ.
Особенности:
new Intl.DateTimeFormat('ru-RU', {
calendar: 'gregory',
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).format(new Date());
Буддийская система широко используется в Таиланде. Основное отличие — смещение эпохи.
new Intl.DateTimeFormat('th-TH', {
calendar: 'buddhist',
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(new Date());
Японская система основана на эрах правления императоров.
Особенности:
new Intl.DateTimeFormat('ja-JP', {
calendar: 'japanese',
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(new Date());
Исламский календарь является лунным и отличается от солнечных систем.
Ключевые характеристики:
new Intl.DateTimeFormat('ar-SA', {
calendar: 'islamic',
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(new Date());
Еврейская система объединяет лунные и солнечные циклы.
Особенности:
new Intl.DateTimeFormat('he-IL', {
calendar: 'hebrew',
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(new Date());
Китайская система является лунно-солнечной и включает циклическую модель.
Особенности:
new Intl.DateTimeFormat('zh-CN', {
calendar: 'chinese',
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(new Date());
Эти системы сохраняют древние традиции исчисления времени.
Общие черты:
new Intl.DateTimeFormat('am-ET', {
calendar: 'ethiopic',
year: 'numeric',
month: 'long',
day: 'numeric'
}).format(new Date());
ISO 8601 представляет собой технический стандарт, используемый в вычислительных системах.
Особенности:
new Intl.DateTimeFormat('en-GB', {
calendar: 'iso8601',
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).format(new Date());
Библиотека FormatJS использует Intl API как базовый слой, поэтому календарные системы доступны через стандартные параметры форматирования.
В react-intl календарь применяется через низкоуровневые
API или кастомные форматтеры:
import { createIntl, createIntlCache } from 'react-intl';
const cache = createIntlCache();
const intl = createIntl({
locale: 'en-US'
}, cache);
intl.formatDate(new Date(), {
year: 'numeric',
month: 'long',
day: 'numeric',
calendar: 'buddhist'
});
Локаль и календарь взаимодействуют, но не являются взаимозависимыми:
Пример:
new Intl.DateTimeFormat('en-US', {
calendar: 'japanese',
year: 'numeric',
month: 'long'
}).format(new Date());
Здесь английская локаль не меняет японскую систему летоисчисления, но влияет на язык вывода.
Особенно важно учитывать:
При использовании react-intl календарь влияет на все
компоненты форматирования:
<FormattedDate />intl.formatDateuseIntl()Пример:
<FormattedDate
value={new Date()}
year="numeric"
month="long"
day="2-digit"
calendar="hebrew"
/>
Хотя стандарт Intl ограничен набором календарей, архитектура FormatJS позволяет:
Пример адаптации:
const buddhistYearOffset = 543;
function formatBuddhistYear(date) {
const year = date.getFullYear() + buddhistYearOffset;
return year;
}
Такой подход применяется при необходимости полной независимости от Intl.
Календарные системы влияют на:
Intl.DateTimeFormat;Рекомендуется:
Intl.DateTimeFormat;const formatter = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic',
year: 'numeric'
});
CLDR определяет:
Без CLDR невозможно корректно отобразить календарь в многоязычных интерфейсах, что делает его фундаментальной частью интернационализации в FormatJS.