グレゴリオ暦以外の暦で年号と時代をどのように表示しますか?
Intl.DateTimeFormatのcalendarとeraオプションを使用して、イスラム暦、ヘブライ暦、中国暦、ペルシャ暦、その他の暦システムの年と時代を表示します
はじめに
グレゴリオ暦は単一の起点から年を数えるため、2024年という数字は明確です。他の暦システムでは年の数え方が異なります。イスラム暦は西暦622年から数えます。ヘブライ暦は何千年も前の伝統的な創造日から数えます。中国暦は連続した数字ではなく、60年周期の名前付き年を使用します。
これらの異なる計算システムは、同じ時点が暦によって異なる年表示を持つことを意味します。グレゴリオ暦の2024年10月15日は、イスラム暦では1446年、ヘブライ暦では5785年、中国暦では2024年(甲辰、jiǎ-chén)です。
JavaScriptのIntl.DateTimeFormatは、任意の暦システムから年と時代を表示するオプションを提供します。calendarオプションはどの暦を使用するかを選択します。yearとeraオプションは年と時代の表示方法を制御します。数字の代わりに名前付きの年を使用する暦の場合、formatToParts()メソッドは年の名前と対応するグレゴリオ暦の年の両方にアクセスできます。
暦システム間での年の違い
暦システムは、数え始める場所、年の番号付け方法、時代(エラ)を使用するかどうかという3つの基本的な方法で異なります。
グレゴリオ暦は西暦1年から数え始め、順次増加します。イスラム暦は西暦622年のヒジュラ暦1年(AH)から始まります。ヘブライ暦は紀元前3761年の1年から始まります。各暦には、年の数え始める時点である独自のエポックがあります。
一部の暦は永遠に増加する連続した年番号を使用します。グレゴリオ暦、イスラム暦、ヘブライ暦、ペルシャ暦はこのように機能します。他の暦は年の名前が繰り返されるサイクルを使用します。中国暦は60年周期の名前付き年を使用します。60年後、サイクルは繰り返されます。
時代(エラ)は時間を名前付きの期間に分けます。グレゴリオ暦はBCとADを使用します。日本の暦は元号を使用します。イスラム暦とヘブライ暦は通常、そのエポックから始まる単一の時代を使用します。中国暦は同じ方法で時代を使用せず、代わりにサイクル内の名前付き年に依存しています。
イスラム暦での年表示
イスラム暦は、ムハンマドがメッカからメディナへ移住した出来事(ヒジュラ)が起きた西暦622年を元年としています。イスラム暦の1年目は西暦622年に相当します。イスラム暦は太陰暦を使用しているため、西暦よりも年が短くなります。これにより、イスラム暦は西暦よりも速く進み、西暦2024年の時点ではイスラム暦1446年となっています。
イスラム暦を指定するには、calendarオプションにislamicを設定するか、ロケール識別子にUnicode拡張子-u-ca-islamicを追加します。
const date = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(formatter.format(date));
// "Rabi' II 12, 1446 AH"
年は1446と表示されます。これは2024年10月15日に相当するイスラム暦の年です。英語でイスラム暦の日付を表示する場合、時代を表す「AH」(After Hijra)が自動的に表示されます。
異なるロケールでは、それぞれの慣習に従ってイスラム暦の日付がフォーマットされます。
const date = new Date('2024-10-15');
const en = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(en.format(date));
// "Rabi' II 12, 1446 AH"
const ar = new Intl.DateTimeFormat('ar-SA', {
calendar: 'islamic',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(ar.format(date));
// "١٢ ربيع الآخر ١٤٤٦ هـ"
アラビア語のロケールでは、アラビア=インド数字が使用され、月名はアラビア語で表示されます。時代を表す記号は「هـ」(ヒジュラのアラビア語略称)に変わります。
イスラム暦での時代表示の制御
eraオプションは、時代表示の有無とその表示方法を制御します。このオプションは3つの値を受け付けます:時代の完全名称にはlong、略称にはshort、最も簡潔な形式にはnarrowを使用します。
const date = new Date('2024-10-15');
const long = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic',
year: 'numeric',
era: 'long'
});
console.log(long.format(date));
// "1446 Anno Hegirae"
const short = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic',
year: 'numeric',
era: 'short'
});
console.log(short.format(date));
// "1446 AH"
const narrow = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic',
year: 'numeric',
era: 'narrow'
});
console.log(narrow.format(date));
// "1446 A"
long値は「Anno Hegirae」(ラテン語で「ヒジュラの年に」の意)を生成します。short値は「AH」を生成します。narrow値は単に「A」を生成します。
イスラム暦のバリアント
イスラム暦にはいくつかの計算方法の異なるバリアントがあります。JavaScriptでは5つのバリアントをサポートしています:islamic、islamic-civil、islamic-tbla、islamic-umalqura、およびislamic-rgsaです。
islamic-umalquraバリアントはサウジアラビアの公式カレンダーで、天文学的観測に基づいています。islamic-civilバリアントは29日と30日の月を交互に使用する固定的な算術計算を使用します。
const date = new Date('2024-10-15');
const umalqura = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic-umalqura',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(umalqura.format(date));
// "Rabi' II 12, 1446 AH"
const civil = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic-civil',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(civil.format(date));
// "Rabi' II 11, 1446 AH"
これらのバリアントは月の境界を決定するために異なる計算方法を使用するため、同じグレゴリオ暦の日付に対して異なる日数を生成することがあります。
ヘブライ暦での年表示
ヘブライ暦は紀元前3761年の伝統的な創造日から年を数えます。これによりヘブライ暦の年はグレゴリオ暦の年よりもはるかに大きな数字になります。ヘブライ暦の5785年はグレゴリオ暦の2024年に相当します。
ヘブライ暦を指定するには、calendarオプションにhebrewの値を使用するか、ロケール識別子にUnicode拡張子-u-ca-hebrewを追加します。
const date = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('en-US', {
calendar: 'hebrew',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(formatter.format(date));
// "Tishrei 13, 5785"
2024年10月15日に相当するヘブライ暦の年として、5785年と表示されます。ヘブライ暦は太陰太陽暦であり、月は月の満ち欠けに従いますが、定期的な閏月によって太陽年と同期しています。
ヘブライロケールでのヘブライ暦の日付はヘブライ数字と月名を使用します。
const date = new Date('2024-10-15');
const he = new Intl.DateTimeFormat('he-IL', {
calendar: 'hebrew',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(he.format(date));
// "י״ג בתשרי ה׳תשפ״ה"
ヘブライロケールでは、数字として使用されるヘブライ文字を含め、日付が完全にヘブライ語で表示されます。
中国暦で年を表示する
中国暦では、連続した年数の代わりに60年周期の名前付き年を使用します。周期内の各年は、天の幹と地の支という2つの文字で構成された名前を持っています。2024年は甲辰(jiǎ-chén)で、伝統的な中国の占星術では「木の龍」を意味します。
中国暦は名前付きの年を使用するため、連続した年数を持つ暦とは異なる処理が必要です。
const date = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('en-US', {
calendar: 'chinese',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(formatter.format(date));
// "Ninth Month 13, 2024(jiǎ-chén)"
フォーマットされた出力には、グレゴリオ暦の2024年と括弧内の年名「jiǎ-chén」の両方が含まれています。この二重表示により、ユーザーは周期的な年名と対応するグレゴリオ暦の年の両方を理解できます。
中国語ロケールでの中国暦の日付は、漢字を使用して表示されます。
const date = new Date('2024-10-15');
const zh = new Intl.DateTimeFormat('zh-CN', {
calendar: 'chinese',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(zh.format(date));
// "2024甲辰年九月十三"
中国語ロケールでは、年名が漢字で表示されます。このフォーマットでは、年名が日付文字列に自然に統合されています。
年名と関連する年を抽出する
名前付きの年を使用する暦は、周期内の年名と対応するグレゴリオ暦の年という2つの情報を提供します。formatToParts()メソッドはこれらを個別の部分に分離します。
const date = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('zh-CN', {
calendar: 'chinese',
year: 'numeric',
month: 'long',
day: 'numeric'
});
const parts = formatter.formatToParts(date);
console.log(parts);
parts配列には、2つの関連エントリが含まれています:
[
{ type: 'relatedYear', value: '2024' },
{ type: 'yearName', value: '甲辰' },
// ... その他の部分
]
relatedYear部分には4桁のグレゴリオ暦の年が含まれています。yearName部分には周期的な年名が含まれています。この分離により、カスタムフォーマットで両方の値のいずれかまたは両方を使用できます。
これらの部分を抽出して、カスタム日付表示を作成できます。
const date = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('zh-CN', {
calendar: 'chinese',
year: 'numeric',
month: 'long',
day: 'numeric'
});
const parts = formatter.formatToParts(date);
const yearName = parts.find(p => p.type === 'yearName')?.value;
const relatedYear = parts.find(p => p.type === 'relatedYear')?.value;
console.log(`Year name: ${yearName}`);
// "Year name: 甲辰"
console.log(`Gregorian year: ${relatedYear}`);
// "Gregorian year: 2024"
この技術は、名前付きの年や周期を使用するあらゆる暦で機能します。
ペルシャ暦での年表示
ペルシャ暦(太陽ヒジュラ暦とも呼ばれる)は、イスラム暦と同じく西暦622年のヒジュラを起点として年を数えます。ただし、ペルシャ暦は太陽月を使用するため、構造的にはグレゴリオ暦に近いものとなっています。
ペルシャ暦を指定するには、calendarオプションにpersianを設定するか、ロケール識別子にUnicode拡張子-u-ca-persianを追加します。
const date = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('en-US', {
calendar: 'persian',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(formatter.format(date));
// "Mehr 24, 1403 AP"
年は1403と表示されます。これは2024年10月15日に対応するペルシャ暦の年です。英語形式では時代を表す「AP」(Anno Persico)が表示されます。
ペルシャ語ロケールでのペルシャ暦の日付は、ペルシャ数字と月名を使用します。
const date = new Date('2024-10-15');
const fa = new Intl.DateTimeFormat('fa-IR', {
calendar: 'persian',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(fa.format(date));
// "۲۴ مهر ۱۴۰۳ ه.ش."
ペルシャ語ロケールでは、ペルシャ語(ファルシ語)の文字と数字を使用して日付が表示されます。時代を示す「ه.ش.」は太陽ヒジュラ暦を表すペルシャ語の略語です。
カレンダーと時代オプションの組み合わせ
calendarとeraオプションを組み合わせることで、異なる暦システム間での年と時代の表示方法を正確に制御できます。この組み合わせにより、日付フォーマットを精密に制御することが可能になります。
const date = new Date('2024-10-15');
const gregorian = new Intl.DateTimeFormat('en-US', {
calendar: 'gregory',
year: 'numeric',
month: 'long',
era: 'short'
});
console.log(gregorian.format(date));
// "October 2024 AD"
const islamic = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic',
year: 'numeric',
month: 'long',
era: 'short'
});
console.log(islamic.format(date));
// "Rabi' II 1446 AH"
const hebrew = new Intl.DateTimeFormat('en-US', {
calendar: 'hebrew',
year: 'numeric',
month: 'long',
era: 'short'
});
console.log(hebrew.format(date));
// "Tishrei 5785"
グレゴリオ暦とイスラム暦の日付は、eraオプションが設定されているため時代を示す表記が表示されます。ヘブライ暦の日付では、このフォーマットでは時代を示す表記は表示されません。ヘブライ暦のフォーマットでは通常これを省略するためです。
また、ロケールと暦を組み合わせることで、ある言語で別の文化の暦を使用した日付を表示することもできます。
const date = new Date('2024-10-15');
const englishIslamic = new Intl.DateTimeFormat('en-US', {
calendar: 'islamic',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(englishIslamic.format(date));
// "Rabi' II 12, 1446 AH"
const arabicIslamic = new Intl.DateTimeFormat('ar-SA', {
calendar: 'islamic',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(arabicIslamic.format(date));
// "١٢ ربيع الآخر ١٤٤٦ هـ"
両方のフォーマッターはイスラム暦を使用していますが、英語ロケールでは英語の月名とラテン数字が生成され、アラビア語ロケールではアラビア語の月名とアラビア=インド数字が生成されます。
複数のカレンダーで年を表示する
国際的なユーザーにサービスを提供するアプリケーションでは、同じ日付を複数のカレンダーシステムで表示する必要があることがよくあります。複数のフォーマッターを作成して、並列表示することができます。
const date = new Date('2024-10-15');
const calendars = [
{ name: 'Gregorian', calendar: 'gregory' },
{ name: 'Islamic', calendar: 'islamic' },
{ name: 'Hebrew', calendar: 'hebrew' },
{ name: 'Persian', calendar: 'persian' }
];
calendars.forEach(cal => {
const formatter = new Intl.DateTimeFormat('en-US', {
calendar: cal.calendar,
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(`${cal.name}: ${formatter.format(date)}`);
});
結果は以下のようになります:
Gregorian: October 15, 2024
Islamic: Rabi' II 12, 1446 AH
Hebrew: Tishrei 13, 5785
Persian: Mehr 24, 1403 AP
各カレンダーは、それぞれの年の数え方と時代表示を使用して、同じ時点を表現しています。
一般的なユースケース
国際的なアプリケーションでは、ユーザーが期待するカレンダーシステムで日付を表示する必要があります。イスラム銀行のアプリケーションでは、イスラム暦を使用して取引日を表示します。
const transactionDate = new Date('2024-10-15');
const formatter = new Intl.DateTimeFormat('ar-SA', {
calendar: 'islamic-umalqura',
year: 'numeric',
month: 'long',
day: 'numeric',
era: 'short'
});
console.log(`Transaction date: ${formatter.format(transactionDate)}`);
// "Transaction date: ١٢ ربيع الآخر ١٤٤٦ هـ"
宗教的なカレンダーは、祝日や儀式の日付を決定します。ユダヤ暦アプリケーションでは、祝日のヘブライ暦日付を表示します。
const roshHashanah2024 = new Date('2024-10-03');
const formatter = new Intl.DateTimeFormat('he-IL', {
calendar: 'hebrew',
year: 'numeric',
month: 'long',
day: 'numeric'
});
console.log(`Rosh Hashanah: ${formatter.format(roshHashanah2024)}`);
// "Rosh Hashanah: א׳ בתשרי ה׳תשפ״ה"
歴史的なアプリケーションでは、当時使用されていたカレンダーシステムで日付を表示します。古代ペルシャに関するアプリケーションでは、ペルシャ暦を使用して日付を表示します。
const historicalDate = new Date('2024-03-20');
const formatter = new Intl.DateTimeFormat('en-US', {
calendar: 'persian',
year: 'numeric',
month: 'long',
day: 'numeric',
era: 'long'
});
console.log(`Persian New Year: ${formatter.format(historicalDate)}`);
// "Persian New Year: Farvardin 1, 1403 Anno Persico"
要約
グレゴリオ暦以外の暦は、異なる起点から年を数え、異なる番号付けシステムを使用しています。イスラム暦は西暦622年から数え始め、現在は1446年頃を表示しています。ヘブライ暦は紀元前3761年から数え始め、5785年頃を表示しています。中国暦は連続した数字の代わりに、60年周期の名前付き年を使用しています。
JavaScriptのIntl.DateTimeFormatはcalendarオプションを通じてこれらの暦システムをサポートしています。値にはislamic、hebrew、chinese、persianなどがあります。yearオプションは年の表示を制御し、eraオプションは時代表示の有無とその表示方法を制御します。
名前付きの年を使用する暦は、formatToParts()を通じて2つの情報を提供します。yearName部分には周期的な年の名前が含まれます。relatedYear部分には対応するグレゴリオ暦の年が含まれます。これにより、アプリケーションはどちらか一方または両方の値を表示することができます。
異なるロケールでは同じ暦でも異なる方法でフォーマットされます。イスラム暦は英語ではラテン数字で、アラビア語ではアラビア=インド数字で表示されます。フォーマットは暦の年の番号付けシステムを維持しながら、ロケールの慣習に自動的に適応します。