紀元表示(BC/AD等)を表示する方法

Intl.DateTimeFormatのeraオプションを使用して、西暦紀元、紀元前、その他の暦体系の元号を表示します

はじめに

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

また、異なる文化圏では独自の紀元を持つ異なる暦体系を使用しています。日本の暦は令和や平成のような天皇の治世による元号で時代を区分します。仏暦は仏陀の入滅から年数を数えます。イスラム暦はヒジュラから始まる独自の紀元を持っています。

JavaScriptのIntl.DateTimeFormatは、これらの表示を行うeraオプションを提供します。このオプションはグレゴリオ暦と他の暦体系の両方で機能し、ロケールの慣習に従って紀元を自動的にフォーマットします。

暦体系における紀元の理解

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

紀元は歴史的な日付を表示する際に重要になります。500年という年は紀元500年または紀元前500年を指す可能性があり、これらは1000年離れた2つの日付です。紀元表示を追加することで、この曖昧さが解消されます。

他の暦体系では紀元の定義が異なります。日本の暦は天皇の治世ごとに元号が変わります。仏暦は紀元前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."

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

まとめ

Intl.DateTimeFormateraオプションは、AD、BC、または他の暦体系の紀元名などの紀元表示を表示します。このオプションは3つの値を受け入れます。「Anno Domini」のような完全な紀元名にはlong、「AD」のような略語にはshort、「A」のような最もコンパクトな形式にはnarrowを使用します。

紀元前の日付には、JavaScript Dateコンストラクタで負の年数が必要です。書式設定された出力では、年は正の数値として表示され、紀元表示によって紀元1年の前か後かが示されます。

他の暦体系には独自の紀元があります。日本の暦では令和のような元号を使用します。仏暦では紀元前543年に始まる単一の紀元を使用します。暦体系はロケール識別子のUnicode拡張を使用して指定します。

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