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 件のコメント:
コメントを投稿