Как отобразить обозначения эпох, такие как до н.э. и н.э.?

Используйте опцию era в Intl.DateTimeFormat, чтобы отображать Anno Domini, до н.э. и названия эпох из других календарных систем

Введение

Большинство дат, с которыми вы работаете, относятся к текущей эре григорианского календаря, что делает указание эры ненужным. Дата вроде "15 октября 2024 года" понятна без добавления "н.э." в конце. Однако исторические даты, относящиеся к периоду более двух тысяч лет назад, требуют указания эры, чтобы уточнить, относится ли год к периоду до или после 1 года.

Разные культуры также используют разные календарные системы со своими собственными эрами. Японский календарь делит время на императорские эры, такие как Рэйва и Хэйсэй. Буддийский календарь отсчитывает годы с момента смерти Будды. Исламский календарь имеет свою эру, начинающуюся с Хиджры.

Intl.DateTimeFormat в JavaScript предоставляет опцию era, которая отображает эти индикаторы. Эта опция работает как с григорианским календарем, так и с другими календарными системами, автоматически форматируя эру в соответствии с локальными конвенциями.

Понимание эр в календарных системах

Эра представляет собой период времени, отсчитываемый от значимого события или начальной точки. Григорианский календарь использует две эры: н.э. (Anno Domini, что означает "в год Господа нашего") для дат после 1 года и до н.э. (до Рождества Христова) для дат до 1 года.

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

Другие календарные системы определяют эры по-другому. В японском календаре эра меняется с каждым правлением императора. Буддийский календарь использует одну эру, начинающуюся в 543 году до н.э. Каждая календарная система имеет свои собственные правила отображения названий эр.

Отображение индикаторов эпох в григорианских датах

era (эпоха) — это опция, которая принимает три значения, определяющие, как будет отображаться эпоха. Значение long показывает полное название эпохи. Значение short отображает сокращённую форму. Значение narrow показывает наиболее компактное представление.

const date = new Date('2024-10-15');

const long = new Intl.DateTimeFormat('en-US', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'long'
});
console.log(long.format(date)); // "October 15, 2024 Anno Domini"

const short = new Intl.DateTimeFormat('en-US', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'short'
});
console.log(short.format(date)); // "October 15, 2024 AD"

const narrow = new Intl.DateTimeFormat('en-US', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'narrow'
});
console.log(narrow.format(date)); // "October 15, 2024 A"

Значение long выводит "Anno Domini" для дат нашей эры. Значение short выводит "AD". Значение narrow выводит просто "A".

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

Форматирование дат до нашей эры с индикаторами эпохи

JavaScript представляет даты до нашей эры, используя отрицательные номера годов или передавая отрицательные значения в конструктор Date. Год -500 соответствует 501 году до нашей эры, год -1 соответствует 2 году до нашей эры, а год 0 соответствует 1 году до нашей эры.

const bcDate = new Date(-500, 0, 1); // 1 января 501 года до нашей эры

const long = new Intl.DateTimeFormat('en-US', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'long'
});
console.log(long.format(bcDate)); // "January 1, 501 Before Christ"

const short = new Intl.DateTimeFormat('en-US', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'short'
});
console.log(short.format(bcDate)); // "January 1, 501 BC"

Значение long выводит "Before Christ" для дат до нашей эры. Значение short выводит "BC". Год отображается как положительное число с индикатором эпохи, показывающим, относится ли он к периоду до или после 1 года.

Даты до нашей эры требуют тщательной обработки, так как объект Date в JavaScript имеет ограничения при работе с датами, относящимися к далёкому прошлому. Исторические даты до стандартизации григорианского календаря в 1582 году являются приблизительными, а даты до 1 года используют календарную систему, которая тогда не существовала.

Отображение эр в японском календаре

Японский календарь использует названия эр, которые меняются с каждым правлением императора. Текущая эра — Рэйва, начавшаяся в 2019 году. Предыдущая эра — Хэйсэй, которая длилась с 1989 по 2019 год.

Вы можете указать японский календарь, используя расширение Unicode -u-ca-japanese в идентификаторе локали.

const date = new Date('2024-10-15');

const long = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'long'
});
console.log(long.format(date)); // "令和6年10月15日"

const short = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'short'
});
console.log(short.format(date)); // "令和6年10月15日"

const narrow = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'narrow'
});
console.log(narrow.format(date)); // "R6年10月15日"

Значения long и short отображают "令和" (Рэйва) с указанием года внутри этой эры. 2024 год — это 6-й год эры Рэйва. Значение narrow отображает "R" как компактное сокращение.

Отображаемый год — это не григорианский год, а год внутри текущей императорской эры. Каждая эра начинает отсчет с 1.

Отображение эр в буддийском календаре

Буддийский календарь отсчитывает годы с момента смерти Будды в 543 году до н.э. Буддийский год 2567 соответствует григорианскому 2024 году.

Вы можете указать буддийский календарь, используя расширение Unicode -u-ca-buddhist в идентификаторе локали.

const date = new Date('2024-10-15');

const long = new Intl.DateTimeFormat('th-TH-u-ca-buddhist', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'long'
});
console.log(long.format(date)); // "15 ตุลาคม พุทธศักราช 2567"

const short = new Intl.DateTimeFormat('th-TH-u-ca-buddhist', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'short'
});
console.log(short.format(date)); // "15 ตุลาคม พ.ศ. 2567"

Значение long отображает "พุทธศักราช" (Буддийская эра) как полное название эры. Значение short отображает "พ.ศ." как сокращенную форму. Год 2567 представляет буддийский календарный год, соответствующий 2024 году в григорианском календаре.

Буддийский календарь широко используется в Таиланде, Камбодже, Лаосе, Мьянме и Шри-Ланке.

Как форматирование эпох варьируется в разных локалях

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

const date = new Date('2024-10-15');
const options = {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'short'
};

const en = new Intl.DateTimeFormat('en-US', options);
console.log(en.format(date)); // "October 15, 2024 AD"

const fr = new Intl.DateTimeFormat('fr-FR', options);
console.log(fr.format(date)); // "15 octobre 2024 ap. J.-C."

const de = new Intl.DateTimeFormat('de-DE', options);
console.log(de.format(date)); // "15. Oktober 2024 n. Chr."

Английский использует "AD" (Anno Domini). Французский использует "ap. J.-C." (après Jésus-Christ, что означает "после Иисуса Христа"). Немецкий использует "n. Chr." (nach Christus, что означает "после Христа").

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

const bcDate = new Date(-500, 0, 1);
const options = {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'short'
};

const en = new Intl.DateTimeFormat('en-US', options);
console.log(en.format(bcDate)); // "January 1, 501 BC"

const fr = new Intl.DateTimeFormat('fr-FR', options);
console.log(fr.format(bcDate)); // "1 janvier 501 av. J.-C."

const de = new Intl.DateTimeFormat('de-DE', options);
console.log(de.format(bcDate)); // "1. Januar 501 v. Chr."

Французский использует "av. J.-C." (avant Jésus-Christ, что означает "до Иисуса Христа") для дат до нашей эры. Немецкий использует "v. Chr." (vor Christus, что означает "до Христа").

Общие случаи использования

Отображение исторических дат требует указания эпох, чтобы избежать путаницы.

const battleOfMarathon = new Date(-490, 8, 12); // 12 сентября 490 года до н.э.

const formatter = new Intl.DateTimeFormat('en-US', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  era: 'short'
});

console.log(`Battle of Marathon: ${formatter.format(battleOfMarathon)}`);
// "Battle of Marathon: September 12, 490 BC"

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

const date = new Date('2024-10-15');

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

console.log(`Japanese date: ${japaneseFormatter.format(date)}`);
// "Japanese date: 令和6年10月15日"

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

const dates = [
  new Date(-2500, 0, 1), // 2501 год до н.э.
  new Date(-500, 0, 1),  // 501 год до н.э.
  new Date(500, 0, 1),   // 500 год н.э.
  new Date(1500, 0, 1)   // 1500 год н.э.
];

const formatter = new Intl.DateTimeFormat('en-US', {
  year: 'numeric',
  era: 'short'
});

dates.forEach(date => {
  console.log(formatter.format(date));
});
// "2501 BC"
// "501 BC"
// "500 AD"
// "1500 AD"

Резюме

Опция era в Intl.DateTimeFormat отображает обозначения эпох, такие как н.э., до н.э. или названия эпох из других календарных систем. Опция принимает три значения: long для полного названия эпохи, например, "Anno Domini", short для сокращений, таких как "н.э.", и narrow для наиболее компактной формы, например, "н".

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

Другие календарные системы имеют свои собственные эпохи. Японский календарь использует названные императорские эпохи, такие как Рэйва. Буддийский календарь использует единую эпоху, начинающуюся в 543 году до н.э. Вы можете указать систему календаря, используя расширения Unicode в идентификаторе локали.

Разные локали используют разные термины для одной и той же эпохи. Английский язык использует "AD" и "BC", французский — "ap. J.-C." и "av. J.-C.", а немецкий — "n. Chr." и "v. Chr.". Форматер автоматически применяет соответствующие термины и их расположение для каждой локали.