2012年10月26日金曜日

Java Calendarの落し罠

Calendarの内部に下記のフィールドを持ってます。
transient boolean areAllFieldsSet;
何らかの操作で該当フィールドがFALSEになると、
月の計算がおかしくなる場合があります。

Calendar cal = 20120930
for (int i = 0; i < 12; i++) {
        System.out.println("===="+cal.getTime());
        cal.add(Calendar.MONTH, -1);
}

====Sun Sep 30 00:00:00 JST 2012
====Thu Aug 30 00:00:00 JST 2012
====Mon Jul 30 00:00:00 JST 2012
====Sat Jun 30 00:00:00 JST 2012
====Wed May 30 00:00:00 JST 2012
====Mon Apr 30 00:00:00 JST 2012
====Fri Mar 30 00:00:00 JST 2012
====Thu Mar 01 00:00:00 JST 2012
====Mon Jan 30 00:00:00 JST 2012
====Fri Dec 30 00:00:00 JST 2011
====Wed Nov 30 00:00:00 JST 2011
====Sun Oct 30 00:00:00 JST 2011

対応方法として、下記のようにオブジェクトを作り直しなければならない

date = (Calendar)Calendar.getInstance().clone();

date.setTime(date.getTime());

 

0 件のコメント:

コメントを投稿