JavaのCalendarクラスのプロパティ areFieldsSetについての疑問
表題の件について、Javaで以下のようなコードを書いていたときのこと、
private Calendar getStartOfTheDay(Date date) { Calendar cal = Calendar.getInstance(); // (1) cal.setTime(date); // (2) return DateUtils.truncate(cal, Calendar.DATE); }
(1)の時点では、calは現在時刻を指しており、(2)が実行された時点でメソッド引数に渡したdateと同一時刻を指すようになるはずなのだけど、現在時刻を指したままという事象が発生した。
デバッガで確認してみると、calのプロパティareFieldSetがfalseになっていた。
areFieldSetはJDK6のCalendarクラスのapidocでは以下のように説明されていた。
fields[] が現在設定されている時刻と同期をとっている場合は true です。false の場合は、次にフィールドの値を取得しようとしたときに、time の現在値からのすべてのフィールドが再計算されます。
timeはCalendarクラスのインスタンスが保持しているUnixタイムで、DAYとかMONTHとかのfieldとの同期がとれていないというのは分かった。
で、その事象はどういう条件下で発生するの??
上記のコードの場合、デバッガで何回か確認しているうちに、いつの間にか発生しなくなってしまった。
また、areFieldSetがfalseの場合に同期をとるにはどうしたらいいのか?
false の場合は、次にフィールドの値を取得しようとしたときに、time の現在値からのすべてのフィールドが再計算されます。
Calendar.get(Calendar.DATE)とか適当に実行してやればいいってことなの?
そもそもareFieldSetはprotectedなので、プログラム中で参照できないんですけど。
どうしたらいいんだこれ?