BC/ADやその他の時代表示をどのように表示しますか?

西暦(紀元後)、紀元前、および他の暦システムからの時代名を表示するには、Intl.DateTimeFormatのeraオプションを使用します

はじめに

通常扱う日付のほとんどはグレゴリオ暦の現代に属しているため、時代を示す表記は不要です。「2024年10月15日」のような日付は、末尾に「西暦」を付けなくても明確です。しかし、2000年以上前の歴史的な日付については、その年が紀元前か紀元後かを明確にするために時代表記が必要です。

異なる文化では、独自の時代区分を持つ異なる暦システムも使用されています。日本の暦では、令和や平成のような元号で時代を区分しています。仏教暦ではブッダの死から年を数えます。イスラム暦はヒジュラ(聖遷)から始まる独自の時代区分を持っています。

JavaScriptのIntl.DateTimeFormatは、これらの時代表記を表示するeraオプションを提供しています。このオプションはグレゴリオ暦と他の暦システムの両方で機能し、ロケールの慣習に従って時代を自動的にフォーマットします。

暦システムにおける時代区分の理解

時代区分は、重要な出来事や起点から数えられる期間を表します。グレゴリオ暦では2つの時代区分を使用しています:紀元後(Anno Domini、「主の年に」の意)は1年以降の日付を表し、紀元前(Before Christ)は1年より前の日付を表します。

歴史的な日付を表示する際に時代区分が重要になります。「500年」という表記は、西暦500年か紀元前500年かを指す可能性があり、これらは1000年離れた日付です。時代表記を追加することでこの曖昧さを解消します。

他の暦システムでは時代区分の定義が異なります。日本の暦では各天皇の治世ごとに元号が変わります。仏教暦は紀元前543年から始まる単一の時代区分を使用しています。各暦システムには、時代名を表示するための独自の慣習があります。

グレゴリオ暦の日付に紀元表示を表示する

eraオプションは紀元の表示方法を制御する3つの値を受け付けます。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値はAD(西暦)の日付に対して「Anno Domini」を生成します。short値は「AD」を生成します。narrow値は単に「A」を生成します。

現代の日付では、現在の紀元の日付はデフォルトで想定されているため、紀元表示は冗長です。通常、区別が重要な歴史的な日付を表示する場合にのみ紀元を含めます。

紀元表示を使用してBC(紀元前)の日付をフォーマットする

JavaScriptでは、負の年数またはDateコンストラクタに負の値を渡すことでBC(紀元前)の日付を表現します。年-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値はBC(紀元前)の日付に対して「Before Christ」を生成します。short値は「BC」を生成します。年は正の数として表示され、紀元表示によって1年より前か後かが示されます。

BC(紀元前)の日付は、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日"

longshortの値はどちらも「令和」の後に元号内の年数を表示します。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."

フランス語ではBC日付に「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日"

学術的または歴史的な文書では、時代を超えて一貫性を維持するために、BCとADの両方を明示的に表示することがよくあります。

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"

要約

Intl.DateTimeFormateraオプションは、AD、BCなどの時代表示や、他の暦システムからの時代名を表示します。このオプションは3つの値を受け付けます:「Anno Domini」のような完全な時代名にはlong、「AD」のような略語にはshort、「A」のような最もコンパクトな形式にはnarrowです。

BC(紀元前)の日付はJavaScript Dateコンストラクタで負の年数を必要とします。フォーマットされた出力では、年が正の数として表示され、時代表示によって紀元1年の前か後かが示されます。

他の暦システムには独自の時代があります。日本の暦では令和などの元号が使用されます。仏教暦は紀元前543年に始まる単一の時代を使用します。暦システムはロケール識別子のUnicode拡張を使用して指定します。

異なるロケールでは同じ時代に対して異なる用語が使用されます。英語では「AD」と「BC」、フランス語では「ap. J.-C.」と「av. J.-C.」、ドイツ語では「n. Chr.」と「v. Chr.」を使用します。フォーマッタは各ロケールに適切な用語と配置を自動的に適用します。