Date And Time APIの和暦サポート

Date And Time APIでは、和暦が標準でサポートされている。

「JapaneseDate」「JapenseEra」

クラスとしては「JapaneseDate」と「JapenseEra」が存在する。

和暦関連クラス図

和暦クラス図

Table 1. 和暦関連クラス説明
クラス 概要

JapaneseDate

特殊なLocalDateのようなクラス。
LocalDateの機能に加え、元号の年の取得や表示を可能。

JapenseEra

元号を表すEnumで「明治」「大正」「昭和」「平成」が定義されている。

和暦で注意しなければならないのは、「明治6年」以前がサポートされていないこと。「明治6年1月1日」以前のJapaneseDateを生成しようとすると、DateTimeExceptionになる。これは日本が明治6年以降にグレゴリオ歴を導入したため。元号に関する仕様については「JIS X 301」が元になっている。

基本的な使い方

基本的には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」があるのでそれの修正をする。

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()などで取得する。