torutkのブログ

ソフトウェア・エンジニアのブログ

java.util.CalendarのgetActualMaximumメソッドのはまりポイント(2) - 年の最大値

id:torutk:20110629 の関連です。

 Calendar theDay = Calendar.getInstance();
 int maxYear = theDay.getActualMaximum(Calendar.YEAR);

というコードで、カレンダーの取りえる年の最大値を取得すると、プログラムを実行した日によって値が変わるという現象がありました。

実行日 取得値
8月17日以前 292278994
8月18日以降 292278993

うーん、この値についてAPIJavadocには言及が見当たらず、java.util.GregorianCalendarクラスのソースコードを追うと、以下のコメントがありました。

 * The actual maxima for YEAR depend on the type of calendar:
 *
 *     Gregorian = May 17, 292275056 BCE - Aug 17, 292278994 CE
 *     Julian    = Dec  2, 292269055 BCE - Jan  3, 292272993 CE
 *     Hybrid    = Dec  2, 292269055 BCE - Aug 17, 292278994 CE
 *

ということで、前回はまったのと同様、8月17日(を含む)以前にCalendar.getInstance()を実行し、getActualMaximum(Calendar.YEAR)を呼ぶと、292278994ですが、8月18日以降に実行すると、292278994年にはその月日が存在しないので、292278993になる、という仕組みでした。

ちなみに、実行日によらず、292278994を取得したい場合は、単にgetMaximum(Calendar.YEAR)を呼ぶのがよさそうです(GregorianCalendarのgetMaximumメソッドを読むと、まだ断言できませんが)