チェックの比較を中心に.
作成 2002-6-20. 変更 2014-10-23
慶応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/31 | IllegalArgumentException | IllegalArgumentException |
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年以前の太陽太陰暦も面白い.
著者:城風敏彦
ご意見ください
th since 2008/04/22.