GregorianCalendar,自纪元以来时间不稳定

时间:2013-10-17 13:09:33

标签: java timezone epoch gregorian-calendar

我正在将时间转换为使用2000.01.01作为其纪元的外部系统。因为各种计算的纪元,我需要几毫秒,所以我通过使用常量(忽略闰秒的细微差别等等)在两者之间转换;我的常数可能不准确,但现在无关紧要)。测试时,我发现时间转换很奇怪。

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

我已经使用不同的时区重做测试并得到同样的问题。

有谁知道可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:2)

日历对象时间精度到毫秒。在您的set epoch.set(2000,Calendar.JANUARY,1,0,0,0)方法中,毫秒秒值不会重置为0.

您可以按如下方式单独将其设置为零,以便在多次运行中获得相同的差异

 epoch.set(Calendar.MILLISECOND, 0)