Японский календарь

Календарные системы в Intl.DateTimeFormat позволяют отображать даты не только в григорианском формате, но и в альтернативных системах летоисчисления, где структура года определяется историческими или культурными эпохами. Одной из наиболее характерных является японская календарная система, основанная на эрах правления императоров.


Японский календарь относится к era-based системам, где отсчёт времени ведётся не от фиксированной точки (как в григорианском календаре), а от начала правления императора. Каждый новый императорский период формирует новую эру, и годы считаются заново внутри неё.

Основные эпохи современной системы:

  • Reiwa — с 2019 года по настоящее время
  • Heisei — 1989–2019
  • Showa — 1926–1989
  • Taisho — 1912–1926
  • Meiji — 1868–1912

Каждая дата в японской системе содержит не только числовой год, но и имя эры.


Поддержка японского календаря в Intl API

В ECMAScript Internationalization API выбор календаря задаётся через параметр calendar в Intl.DateTimeFormat или через расширение локали Unicode extension.

Японский календарь обозначается идентификатором:

  • japanese

Пример создания форматтера:

const formatter = new Intl.DateTimeFormat('ja-JP', {
  calendar: 'japanese',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(new Date()));

В результате дата будет отображена с указанием японской эры.


Unicode Locale Identifier и расширение u-ca

Альтернативный способ задания календаря — использование расширения локали:

  • ja-JP-u-ca-japanese

Пример:

const formatter = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});

console.log(formatter.format(new Date()));

В этом случае календарь фиксируется непосредственно в строке локали, и параметр calendar в options становится необязательным.


Форматирование годов в японском календаре

Особенность японской системы заключается в том, что год отображается относительно начала эры.

Например:

const d1 = new Date('2020-01-01');
const d2 = new Date('1990-01-01');

const fmt = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
  year: 'numeric'
});

console.log(fmt.format(d1));
console.log(fmt.format(d2));

Результаты будут примерно такими:

  • Reiwa 2 (2020 год)
  • Heisei 2 (1990 год)

Год 1 в каждой эре соответствует её началу.


Стили отображения эры

Поле era управляет тем, как отображается название эпохи.

Возможные значения:

  • long — полное название (Reiwa, Heisei)
  • short — сокращённый вариант
  • narrow — максимально компактное представление

Пример:

const fmt = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
  era: 'long',
  year: 'numeric'
});

console.log(fmt.format(new Date('2021-01-01')));

Различия проявляются особенно заметно в интерфейсах, где важна плотность текста.


Сравнение с григорианским календарём

При использовании стандартного формата:

new Intl.DateTimeFormat('en-GB', { year: 'numeric' })

год всегда отображается как абсолютное число (например, 2026).

В японской системе:

new Intl.DateTimeFormat('ja-JP-u-ca-japanese', { year: 'numeric' })

год становится относительным значением внутри эры, что изменяет саму модель интерпретации времени.


Поведение при смене эпохи

Переход между эрами — ключевая особенность японского календаря. Когда начинается новая эпоха, счёт годов обнуляется.

Например:

  • 30 апреля 2019 — последний день Heisei 31
  • 1 мая 2019 — первый день Reiwa 1

Это влияет на форматирование дат, особенно при работе с историческими данными, где важна точность отображения эпохи.


Влияние других параметров форматирования

Японский календарь корректно комбинируется с другими опциями Intl.DateTimeFormat:

  • month
  • day
  • weekday
  • hour, minute, second

Пример полного форматирования:

const fmt = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
  era: 'long',
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  weekday: 'long'
});

console.log(fmt.format(new Date()));

Результат включает день недели, месяц, число и эпоху в едином локализованном формате.


Поведение в разных окружениях

Поддержка японского календаря зависит от реализации движка JavaScript и ICU-библиотеки, используемой в среде выполнения.

Современные браузеры и Node.js обычно поддерживают:

  • корректное отображение эр
  • локализованные названия месяцев и дней
  • обработку исторических переходов между эпохами

При этом формат может незначительно отличаться в зависимости от версии ICU.


Ограничения Intl API при работе с календарями

Intl.DateTimeFormat отвечает только за форматирование, но не за вычисление или хранение дат в альтернативных календарях.

Ключевые ограничения:

  • внутренняя модель даты остаётся Unix timestamp (миллисекунды с 1970 года)
  • календарь влияет только на представление
  • нельзя выполнять арифметику дат в терминах эр напрямую

Таким образом, японский календарь в Intl — это слой локализации поверх стандартной временной модели.


Использование в интерфейсах

Японская система календаря применяется в интерфейсах, ориентированных на локализацию под японскую аудиторию, где важна не абсолютная дата, а принадлежность к исторической эпохе.

Форматирование через Intl.DateTimeFormat позволяет унифицировать отображение без ручного вычисления эр и границ их начала.