更新されたカレンダー オブジェクトで getTimeInMilliseconds() を呼び出すことができるように、実際の日付/時刻を維持しながらカレンダー オブジェクトのタイムゾーンを変更しようとしています。
私はこの他の質問を見ました。ここで受け入れられている答えは、新しい Calendar オブジェクトの各フィールドを個別に設定することです。ただし、元の Calendar オブジェクトのコピーのタイムゾーンを変更するだけで機能させることができました。奇妙なことに、これは timeZone をリセットする前に元の Calendar に変更を加えた場合にのみ機能します。次の例は、不一致を示しています。
public void TestCalendar()
{
Calendar nextYear = Calendar.getInstance();
nextYear.add(Calendar.YEAR, 1);
log.info("Next Year: {}", getUTCMilliseconds(nextYear));
Calendar now = Calendar.getInstance();
log.info("Now: {}", getUTCMilliseconds(now));
}
protected String getUTCMilliseconds(Calendar cal)
{
// Create a new calendar so we don't modify input
Calendar expectedDbTime = (Calendar) cal.clone();
// Change the TimeZone the contained date is interpreted in
expectedDbTime.setTimeZone(TimeZone.getTimeZone("UTC"));
// Return millisecond value of this date in the UTC timezone
return String.valueOf(expectedDbTime.getTimeInMillis());
}
このプログラムを 2015 年 1 月 24 日午後 2 時 33 分に実行したところ、次の出力が得られました。
Next Year: 1422110038529 //(Corresponding UTC Date: Sat Jan 24 2015 2:33:58 PM)
Now: 1390599238531 //(Corresponding UTC Date: Fri Jan 24 2014 9:33:58 PM)
ご覧のとおり、nextYear は期待どおりに出力されますが、次の行は期待どおりではありません (1/24/2014 2:33:58PM UTC に対応する必要があります。代わりに、1/24 である現在の日付/時刻に対応します)。 /2014 2:33:58 MTN)。誰かがここで何が起こっているのか教えてもらえますか?
編集: いくつかのフォーマットを更新しました。