Java和暦クラス

チェックの比較を中心に.
作成 2002-6-20. 変更 2014-10-23

まえがき

和暦の入力チェックを中心に調査し、独自実装したJava和暦クラス(JaCalendar)の報告.
方針は以下のとおり.

比較

慶応4/9/7慶応4/9/8明治5/12/31明治45/7/30大正15/12/25
JapaneseDate(Java8) 設定できない 設定できない DateTimeException DateTimeException DateTimeException
JapaneseImperialCalendar(Java6)
.setLenient(false)
設定できない設定できない明治5/12/31IllegalArgumentExceptionIllegalArgumentException
JapaneseImperialCalendar(Java6)設定できない設定できない 明治5/12/31大正1/7/30昭和1/12/25
JapaneseCalendar(ICU4J)慶応4年9月7日明治1年9月8日明治5/12/31大正1/7/30昭和1/12/25
JaCalendar(独自実装)設定できない設定できない明治5/12/31明治45/7/30を受け入れるが
西暦から再変換すると大正1/7/30
大正T15/12/25を受け入れるが
西暦から再変換すると昭和1/12/25

Java8には JapaneseDate が追加された.
和暦としての機能はJava6のJapaneseImperialCalendarと大差ない.
明治5年以前は旧暦なのでサポート外. 月が日本人感覚の(1月=1)になっている.

Java6には和暦クラス
JapaneseImprerialCalendarが登場した.
1912年7月30日,1926年12月25日には対応してない.

Java5までで和暦を扱いたい場合、
IBM ICU4Jの JapaneseCalendar がある.明治より前の元号を扱えるのはこれだけ。

JapaneseImprerialCalendar(setLenient(false)なし)とJapaneseCalendarは存在しない日付(例えば昭和1年6月1日.昭和1年は12月25日からなので) をいれても適当に解釈して該当する大正の日付で返す.これではチェックとして不十分な場面もあると 感じて、今回作成した和暦クラスは存在しない日付に対してDateTimeExceptionをthrowするようにした.

実装クラス

元号つきの年と西暦の年の変換機能をもつ独自実装の和暦クラス(JaCalendar).
インスタンス変数としてGregorianCalendarを持ち,元号と和暦年はメソッドで計算して返す.
元号つき日付のセットは対応するGregorianCalendarを計算してセットする.

ソース一式は Java和暦クラスソースで参照できる.

考察

最初はデザインパターンにかぶれてインターフェース、抽象クラスも作ったが不要だった.
改良の方向としてはイミュータブル(new後は変更不能)と昔書いたが、Java8のJapaneseDateはイミュータブルになった.
明治5年以前の太陽太陰暦も面白い.

Link

著者:城風敏彦

ご意見ください

th since 2008/04/22.


Java道場へ. Java道場(開発環境編)へ.