サポートされるカレンダ
ここでは、Sun の JDK (Java SE Development Kit) 6 と JRE (Java SE Runtime Environment) 6 でサポートされるカレンダシステムについて説明します。Java SE プラットフォームのほかの実装では、異なるカレンダシステムをサポートする場合があります。
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
|
01.01.68 00:00:00 現地時間
|
Taisho (大正)
|
T
|
2
|
30.07.12 00:00:00 現地時間
|
Showa (昭和)
|
S
|
3
|
25.12.26 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
サブクラスがサポートされていることを確認してください。