Date And Time APIの和暦サポート
Date And Time APIでは、和暦が標準でサポートされている。
Java | Java SE 8 |
「JapaneseDate」「JapenseEra」
クラスとしては「JapaneseDate」と「JapenseEra」が存在する。

クラス | 概要 |
---|---|
JapaneseDate |
特殊なLocalDateのようなクラス。 |
JapenseEra |
元号を表すEnumで「明治」「大正」「昭和」「平成」が定義されている。 |
和暦で注意しなければならないのは、「明治6年」以前がサポートされていないこと。「明治6年1月1日」以前のJapaneseDateを生成しようとすると、DateTimeExceptionになる。これは日本が明治6年以降にグレゴリオ歴を導入したため。元号に関する仕様については「JIS X 301」が元になっている。
-
JIS X 0301 → 日本工業標準調査会:データベース-JIS詳細表示
-
JapaneseDate → JapaneseDate(Java SE 8 API仕様)
-
JapenseEra → JapaneseEra (Java SE 8 API仕様)
基本的な使い方
基本的にはLocalDateのように扱える。元号の年の取得や表示が追加されている。
//西暦からの生成
JapaneseDate japaneseDate = JapaneseDate.of(2016, 7, 14);
//和暦からの生成(japaneseDateと同日)
JapaneseDate fromWareki = JapaneseDate.of(JapaneseEra.HEISEI, 28, 7, 14);
//元号の取得
Era era = japaneseDate.getEra();
//元号の年の取得
int yearOfEra = japaneseDate.get(ChronoField.YEAR_OF_ERA);
//「平成28年」と表示
DateTimeFormatter kanjiFormatter = DateTimeFormatter.ofPattern("Gyy年");
String kanjiFormatted = kanjiFormatter.format(japaneseDate);
//「H.28」と表示
DateTimeFormatter alphabetFormatter = DateTimeFormatter.ofPattern("GGGGG.yy");
String alphabetFormatted = alphabetFormatter.format(japaneseDate);
元号変更への対応
元号が変更された場合、JDKのアップデートが必要。しないとずっと「平成」のままになってしまう。
JDKのアップデートがされなかったり、待てない場合はプロパティファイルの修正でも対応可能。「$JAVA_HOME/jre/lib」下に「calendar.properties」があるのでそれの修正をする。
#
# Japanese imperial calendar
#
# Meiji since 1868-01-01 00:00:00 local time (Gregorian)
# Taisho since 1912-07-30 00:00:00 local time (Gregorian)
# Showa since 1926-12-25 00:00:00 local time (Gregorian)
# Heisei since 1989-01-08 00:00:00 local time (Gregorian)
calendar.japanese.type: LocalGregorianCalendar
calendar.japanese.eras: \
name=Meiji,abbr=M,since=-3218832000000; \
name=Taisho,abbr=T,since=-1812153600000; \
name=Showa,abbr=S,since=-1357603200000; \
name=Heisei,abbr=H,since=600220800000; \
sinceは新元号開始日のlong値。Date#getTime()などで取得する。
Appendix B: 改訂履歴
-
v1.0, 2016-07-20: 初稿