Java 8から導入されたDate-Time APIでは、ISO 8601の規格とは異なるカレンダーシステムを扱える仕組みをjava.time.chronoパッケージに用意されています。その中には和暦を表すJapaneseDateクラスがあります。
和暦は明治6年(西暦1873年)からグレゴリオ暦が導入されたこともあり、1873年1月1日から使うことが可能になっています。JapaneseDateで用意されている年号とその期間は下記になり、その年号を表すJapaneseEraというクラスも用意されています。
年号 | JapaneseEra | 期間 |
---|---|---|
明治 | MEIJI | 1868年1月1日 〜 1912年7月29日 |
大正 | TAISHO | 1912年7月30日 〜 1926年12月24日 |
昭和 | SHOWA | 1926年12月25日 〜 1989年1月7日 |
平成 | HEISEI | 1989年1月8日以降 |
JapaneseDate japaneseDate = JapaneseDate.of(1873, 1, 1); System.out.println(japaneseDate); japaneseDate = JapaneseDate.of(1912, 7, 29); System.out.println(japaneseDate); japaneseDate = JapaneseDate.of(1912, 7, 30); System.out.println(japaneseDate); japaneseDate = JapaneseDate.of(1926, 12, 24); System.out.println(japaneseDate); japaneseDate = JapaneseDate.of(1926, 12, 25); System.out.println(japaneseDate); japaneseDate = JapaneseDate.of(1989, 1, 7); System.out.println(japaneseDate); japaneseDate = JapaneseDate.of(1989, 1, 8); System.out.println(japaneseDate);
Japanese Meiji 6-01-01 Japanese Meiji 45-07-29 Japanese Taisho 1-07-30 Japanese Taisho 15-12-24 Japanese Showa 1-12-25 Japanese Showa 64-01-07 Japanese Heisei 1-01-08
また、ofメソッドには前述のように西暦の年を指定してインスタンスを生成するメソッドと、引数に年号としてJapaneseEraを受け取りインスタンスも用意されています。また、その生成されたインスタンスから年号のインスタンスの取得と和暦での年の取得も可能になっています。
JapaneseDate japaneseDate = JapaneseDate.of(JapaneseEra.HEISEI, 15, 1, 1); System.out.println(japaneseDate); System.out.println("japaneseDate.getEra()=" + japaneseDate.getEra()); System.out.println("japaneseDate.get(ChronoField.YEAR_OF_ERA)=" + japaneseDate.get(ChronoField.YEAR_OF_ERA));
Japanese Heisei 15-01-01 japaneseDate.getEra()=Heisei japaneseDate.get(ChronoField.YEAR_OF_ERA)=15
注意点として、このJapaneseDateがサポートしている明治6年(西暦1873年)より前の日付を持たせようとすると例外が発生します。
JapaneseDate japaneseDate = JapaneseDate.of(1872, 12, 31); System.out.println(japaneseDate); japaneseDate = JapaneseDate.of(1912, 1, 1); System.out.println(japaneseDate);
Exception in thread "main" java.time.DateTimeException: JapaneseDate before Meiji 6 is not supported at java.time.chrono.JapaneseDate.<init>(Unknown Source) at java.time.chrono.JapaneseDate.of(Unknown Source) at jp.co.atmarkit.java.datetimeapi.JapaneseDateSample03.main(JapaneseDateSample03.java:8)
今回はJava 8から導入されたDate-Time APIについて、それまでの旧日時APIからの改善点とDate-Time APIで新たに追加されたクラスなどについて見てきました。
この他にもClockなどのクラスもありますが、今回は主に使われると思われるクラスをメインに説明するため省かせていただきました。気になる方はjava.timeパッケージとその下のパッケージのJavaDocや、英文ですがオラクルのDate-Time APIのチュートリアルを参照してください。
次回は、今回の記事でDate-Time APIで用意されているクラスを学びましたので、それらのDate-Time APIのクラスを使って何ができるのか、用意されているメソッドについて見ていきます。
長谷川 智之(はせがわ ともゆき)
株式会社ビーブレイクシステムズ開発部所属。
社内サークル執筆チーム在籍。
主な執筆。
@IT連載『Javaの常識を変えるPlay framework入門』
日経ソフトウェア連載『コツコツ学ぶAndroidネイティブアプリ開発教室』
Copyright © ITmedia, Inc. All Rights Reserved.