サポートされるカレンダ
ここでは、サポートされる暦体系について説明します。
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以降の紀元を、次に示す各紀元の移行日とともにサポートします。
年号名 (日本語)
|
略語
|
ERA
フィールド値
|
移行日時 (グレゴリオ暦)
|
- (西暦)
|
-
|
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
サブクラスがサポートされていることを確認してください。