読者です 読者をやめる 読者になる 読者になる

DevDevデブ!!

プログラミングのこととか書きます。多分。。。

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なので、プログラム中で参照できないんですけど。
どうしたらいいんだこれ?