0

2000.01.01 をエポックとして使用する外部システムとの間で時刻を変換しています。さまざまな計算にエポックからのミリ秒が必要なので、定数を使用して 2 つを変換します (閏秒などのニュアンスを無視します。私の定数は正確ではないかもしれませんが、今のところ問題ありません)。テスト中に、時間の変換がおかしいことに気付きました。

Calendar epoch = new GregorianCalendar(TimeZone.getTimeZone("Zulu"));
epoch.set(2000,Calendar.JANUARY,1,0,0,0);
System.out.println("EPOCH DIFF:"+(epoch.getTime().getTime()-946684800000L));

これは常に同じ結果になると思うでしょう。ループで実行すると、次のようになります。

for(int i = 0; i < 10; i++) {
        System.out.println("EPOCH DIFF:"+(epoch.getTime().getTime()-946684800000L));
    }

(RESULT: -400)

ただし、新しい VM で何度も実行すると、値は (一見) ランダムに変化し続けます。異なる JVM で立て続けに 5 回実行したところ、異なる結果が得られました。

-276
-612
-376
-458
-573

異なるタイムゾーンでテストをやり直しましたが、同じ問題が発生しました。

誰がこれを引き起こしているのか考えていますか?

4

1 に答える 1

2

Calendar オブジェクトの時刻は、ミリ秒までの精度があります。setepoch.set(2000,Calendar.JANUARY,1,0,0,0)メソッドでは、ミリ秒の値は 0 にリセットされません。

次のように同じものを個別にゼロに設定して、複数の実行で同一の違いを得ることができます

 epoch.set(Calendar.MILLISECOND, 0)
于 2013-10-17T13:23:39.500 に答える