Java

サポートされるカレンダ

 


ここでは、Sun の JDK (Java SE Development Kit) 6 と JRE (Java SE Runtime Environment) 6 でサポートされるカレンダシステムについて説明します。Java SE プラットフォームのほかの実装では、異なるカレンダシステムをサポートする場合があります。


1. はじめに

Calendar は、YEARMONTHDAYHOUR など、Date オブジェクトと整数フィールドセットとの変換を行う抽象基底クラスです。Calendar のサブクラスは、特定のカレンダシステムの規則に従って Date を解釈します。プラットフォームは、Calendar の public 具象サブクラスGregorianCalendar を提供します。ファクトリメソッドである Calendar.getInstance は、指定された Locale のための具象カレンダシステムの実装を返します。サポートされるカレンダシステムは次のとおりです。

ロケール
カレンダシステム
最初の導入バージョン (JRE バージョン)
th_TH (とそのバリアント)
タイ仏暦
1.4
ja_JP_JP
和暦
1.6
上記以外のロケール
グレゴリオ暦 (GregorianCalendar)
1.1


2. タイ仏暦

タイではグレゴリオ暦と「仏暦」による計数が併用されています。仏暦 (พุทธศักราช、略称 B.E. (พ.ศ.)) の初年は、BCE (BC)  543 (ユリウス暦) に相当します。したがって、グレゴリオ暦年 + 543 が B.E. 年になります。

タイ語のロケールが指定されている場合、Calendar.getInstance メソッドはタイ仏暦インスタンスを返します。ロケールは言語および国の値によって決まります。このタイ仏暦の実装は、正確に B.E. 2484 (1941 グレゴリオ暦年) 以後の日付をサポートします。歴史カレンダシステムの移行は、実装によってサポートされていません。仏暦の Calendar.ERA の値は 1 です。

3. 和暦

日本ではグレゴリオ暦と年号の計数が併用されています。年号は天皇の即位で始まり、年号が新しくなると年数が 1 にリセットされます。年号の初年はグレゴリオ暦年の移行とは同期せず、どの日付にも年号の初日となる可能性があります。たとえば、現在の年号の初日は 1989 年 (グレゴリオ暦) 1 月 8 日です。ただし、月日はグレゴリオ暦と同期します。
ロケールを
ja_JP_JP に指定すると、Calendar.getInstance メソッドは和暦インスタンスを返します。この実装は、「Meiji」以降の年号を、次に示す各年号の移行日とともにサポートします。

年号名
(日本語)
略語

ERA
フィールド

移行日時
(グレゴリオ暦)
- (西暦)
-
0
-
Meiji (明治)
M
1
1868-01-01 00:00:00 現地時刻
Taisho (大正)
T
2
30.07.12 00:00:00 現地時刻
Showa (昭和)
S
3
26.12.26 00:00:00 現地時刻
Heisei (平成)
H
4
08.01.89 00:00:00 現地時刻

「Meiji」以前のグレゴリオ暦年の計数はサポートされています。GregorianCalendar と異なり、和暦の実装はグレゴリオ暦年の移行に対応するユリウス暦をサポートしていません。グレゴリオ暦年の 1 以前の数え方は 0、-1、-2 …であり、1、2、3 …ではありません。厳密に言うと、グレゴリオ暦は 1873 年 (Meiji 5) から使用され、他のカレンダシステムはそれ以前から使用されていました。ただし、実装では「Meiji」の初日を 1868 年 1 月 1 日と定義していますが、これは史実ではありません。カレンダシステムに関する日本の法令は、日本国外のタイムゾーンの取り扱いについて規定していません。実装では、年号の移行時刻はどのタイムゾーンでも現地時刻の午前 0 時と想定されています。

Calendar API では、一部のフィールドは、年号移行の年と同期し、そのために年号の初年の例外規則を処理します。次の表にその内容を示します。

カレンダフィールド
説明
WEEK_OF_YEAR
各年号の 1 年目の WEEK_OF_YEAR を算定するには、初日の曜日と最初の週の最少日数から算定する場合と同じ規則を適用します。たとえば、初日の曜日が SUNDAY で最初の週の最少日数が 1 の場合、1926-12-19 の WEEK_OF_YEAR の値は Taisho 15 の 52 となり、1926-12-26 の値は Showa 1 の 1 となります。
DAY_OF_YEAR
各年号の初日の DAY_OF_YEAR は 1 です。たとえば、「Showa」から「Heisei」への移行を見ると、「Showa」(昭和 64.01.07、グレゴリオ暦 1989-01-07) の最終日は 7 であり、その翌日は「Heisei」(平成 1.01.08) の初日なので 1 です。getLeastMaximum メソッドは、すべての年を通じて最少の年間日数を返します。2005 年 (グレゴリオ暦) 時点の値は 6 です。


4. グレゴリオ暦以外の日付の書式設定と構文解析

DateFormat インスタンスには、指定されたロケールまたはデフォルトのロケールによって内部日時を変換するための Calendar インスタンスが含まれています。Calendar インスタンスを作成する場合は、同じ規則 が適用されます。たとえば、ja_JP_JP ロケールが指定された場合、DateFormat.getDateInstance メソッドは、和暦の日付を処理する DateFormat インスタンスを返します。次の コードを実行したとします。
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,
 new Locale("ja", "JP", "JP"));
System.out.println(df.format(new Date()));
次のような出力が生成されます。
平成17年10月25日
そのほか DateFormat.parse メソッドは、年号とともに日付の文字列を解析します。次のコードを実行したとします。
System.out.println(df.parse("平成元年10月25日"));
次のような アジア/東京タイムゾーンの出力が生成されます。
Wed Oct 25 00:00:00 JST 1989
なお、DateFormat.parse メソッドによって返された Date オブジェクトは、対応するグレゴリオ暦の日付を表します。Date を和暦の日付に変換するには、指定された Date に対して Calendar.setTime メソッドを使用する必要があります。

SimpleDateFormat では、タイ仏暦と和暦システムについて次の規則が適用されます。

カレンダシステム
パターン文字
説明
タイ仏暦
G
パターン文字数によって年号名の表示が変わることはありません。
y
パターン文字数には GregorianCalendar と同じ規則が適用されます。
和暦
G
書式設定では、パターン文字数が 4 以上の場合、長い年号名 (たとえば「平成」) が使用されます。それ以外の場合、略語 (たとえば「H」) が使用されます。構文解析では、長い年号名と略語はいずれも受け入れられます。
y
書式設定では、パターン文字数が 4 以上の場合、年号の初年はロケール固有の表現として書式設定されます。たとえば、日本語のロケールなら「」などとなります。 その他の場合、値は数字で表示されます。2 文字および 4 文字から成る GregorianCalendar 日付の書式設定の規則は適用されません。構文解析では、ロケール固有の表現と数字の表現はいずれも受け入れられます。

バリアント要素がタイ語のロケールで「TH」の場合、日時の書式設定にはタイ語の数字が使用されます。たとえば、次のコードを実行したとします。
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,
 new Locale("th", "TH", "TH"));
System.out.println(df.format(new Date()));
次のような出力が生成されます。
วันอังคารที่ ๒๕ ตุลาคม พ.ศ. ๒๕๔๘

5. 直列化について

Calendar.getInstance ファクトリメソッドによって返された Calendar オブジェクトを直列化して別の JVM に送信した場合、直列化された Calendar オブジェクトを作成するために使用した Calendar サブクラスを送信先の JVM がサポートしていなければ、そのオブジェクトの直列化復元は失敗します。直列化された Calendar オブジェクトを交換しようとしている JVM で、同じ Calendar サブクラスがサポートされていることを確認してください。


Copyright © 2005 Sun Microsystems, Inc.All Rights Reserved.
連絡先
Sun Java Software