サポートされるカレンダ
ここでは、サポートされる暦体系について説明します。
1.  はじめに 
Calendarは、YEAR、MONTH、DAY、HOURなど、Dateオブジェクトと整数フィールド・セットとの変換を行う抽象基底クラスです。 Calendarのサブクラスは、特定の暦体系の規則に従ってDateを解釈します。 プラットフォームは、Calendarのpublic具象サブクラスGregorianCalendarを提供します。 ファクトリ・メソッドであるCalendar.getInstanceは、指定されたLocaleのための具象暦体系の実装を返します。 サポートされる暦体系は次のとおりです。
 
 
| 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以降の紀元を、次に示す各紀元の移行日とともにサポートします。
 
 
| 年号名 (日本語)
 
 | 略語 
 
 | ERAfield value
 | 移行日時 (グレゴリオ暦)
 
 | 
| - (西暦) 
 | - 
 | 0 
 | - 
 | 
| Meiji (明治) 
 | M 
 | 1 
 | 1868-01-01 00:00:00現地時間 
 | 
| Taisho (大正) 
 | T 
 | 2 
 | 1912-07-30 00:00:00現地時間 
 | 
| Showa (昭和) 
 | S 
 | 3 
 | 1926-12-25 00:00:00現地時間 
 | 
| Heisei (平成) 
 | H 
 | 4 
 | 1989-01-08 00:00:00現地時間 
 | 
Meijiより前は、グレゴリオ暦年の計数がサポートされています。 GregorianCalendarと異なり、和暦の実装はユリウス暦からグレゴリオ暦への移行をサポートしていません。グレゴリオ暦年の1以前の数え方は0、-1、-2 ...であり、1、2、3 ...ではありません。厳密に言うと、グレゴリオ暦は1873年(Meiji 5)から使用され、他の暦体系はそれ以前から使用されていました。 ただし、実装ではMeijiの初日を1868年1月1日と定義していますが、これは史実ではありません。 暦体系に関する日本の法令は、日本国外のタイムゾーンの取扱いについて規定していません。 実装では、紀元の移行時間はどのタイムゾーンでも現地時間の深夜零時と想定されています。 
 
Calendar APIでは、一部のフィールドは、紀元移行の年と同期し、そのために紀元の初年の例外規則を処理します。 次の表にその内容を示します。
 
 
| カレンダ・フィールド 
 | 説明 
 | 
| WEEK_OF_YEAR
 | 各年号の1年目の WEEK_OF_YEARを算定するには、初日の曜日と最初の週の最少日数から算定する場合と同じ規則を適用します。 たとえば、初日の曜日がSUNDAYで最初の週の最少日数が1の場合、1926-12-18のWEEK_OF_YEARの値はTaisho 15の51となり、1926-12-25の値は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メソッドは、すべての年を通じて最少の年間日数を返します。
 | 
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サブクラスがサポートされていることを確認してください。