Как отобразить обозначения до н.э./н.э. или другие индикаторы эпох?
Используйте опцию era в Intl.DateTimeFormat, чтобы показывать Anno Domini, до нашей эры и названия эпох из других календарных систем
Введение
Большинство дат, с которыми вы работаете, относятся к текущей эпохе григорианского календаря, поэтому индикаторы эпох обычно не нужны. Например, дата «15 октября 2024» понятна и без добавления «н.э.» в конце. Однако для исторических дат, которым более двух тысяч лет, индикаторы эпох необходимы, чтобы уточнить, относится ли год к периоду до или после 1 года.
В разных культурах используются разные календарные системы со своими собственными эпохами. Например, японский календарь делит время на императорские эпохи с названиями, такими как Рэйва и Хэйсэй. В буддийском календаре годы отсчитываются от смерти Будды. В исламском календаре своя эпоха начинается с Хиджры.
В JavaScript Intl.DateTimeFormat есть опция 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); // January 1, 501 BC
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 года.
Даты до н. э. требуют особого подхода, потому что объект JavaScript Date имеет ограничения при работе с очень старыми датами. Исторические даты до стандартизации григорианского календаря в 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); // September 12, 490 BC
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 BC
new Date(-500, 0, 1), // 501 BC
new Date(500, 0, 1), // 500 AD
new Date(1500, 0, 1) // 1500 AD
];
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 отображает индикаторы эры, такие как AD, BC или названия эр из других календарных систем. Опция принимает три значения: long — для полного названия эры, например, «Anno Domini»; short — для сокращений, например, «AD»; и narrow — для самого компактного варианта, например, «A».
Для дат до н. э. в JavaScript-конструкторе Date требуется использовать отрицательные значения года. В отформатированном выводе год отображается как положительное число, а индикатор эры показывает, до или после 1 года относится дата.
В других календарных системах есть свои эры. В японском календаре используются именные императорские эры, например, Рэйва. В буддийском календаре — одна эра, начинающаяся с 543 года до н. э. Календарную систему можно указать с помощью расширений Unicode в идентификаторе локали.
В разных языках для одной и той же эры используются разные обозначения. В английском — «AD» и «BC», во французском — «ap. J.-C.» и «av. J.-C.», в немецком — «n. Chr.» и «v. Chr.». Форматтер автоматически применяет нужные обозначения и их расположение для каждого языка.