1

更新されたカレンダー オブジェクトで 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)。誰かがここで何が起こっているのか教えてもらえますか?

編集: いくつかのフォーマットを更新しました。

4

1 に答える 1