CalendarとDate
今まで通っていた単体テストが、今日になって突然失敗するように。問題のコードは、古いファイルを消す処理で、今日から6か月前を求めるメソッドのテストだったんだけど、メソッド自体は、
calendar.add(Calendar.MONTH, -6);
で、単体テストの方は、今日現在の日付を元に、以下のコードと、テスト対象のメソッドとで結果が一致するかというテストが実装されていた。
date.setMonth(date.getMonth() - 6);Dateを無理矢理使ってテストという発想は面白いけど、現在の日付を使うのはだめだよね。テスト結果が環境に左右されてしまう。それにDate.setMonth()は引数の月には0以上しか許していないし。というかなんで今まで通っていたんだ、と思ったら、Dateクラスは負の月を設定すると、ちゃんと年を戻して対応するようだ。
となるとなんで今日になって失敗したんだろう。
Date date = DateFormat.getDateInstance().parse("2007/5/31");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
date.setMonth(date.getMonth() - 6);
calendar.add(Calendar.MONTH, -6);
System.out.println(date);
System.out.println(calendar.getTime());
Fri Dec 01 00:00:00 JST 2006 Thu Nov 30 00:00:00 JST 2006
ふ〜ん。6か月前は、11/31日になるけど、11月に31日は無いから、どちらかにずらすわけだ。Dateは12/1に、Calendarは11/30にずらすんだね。こんなのDateからCalendarを呼ぶようにしているのかと思ったら、別々にロジックが実装されてるんだ。





