我正在将时间与使用 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
我用不同的时区重做了测试,遇到了同样的问题。
有谁知道可能导致这种情况的原因是什么?
日历对象时间的精度精确到毫秒。在设置epoch.set(2000,Calendar.JANUARY,1,0,0,0)
方法中,毫秒值不会重置为 0。
您可以按如下方式单独将 same 设置为零,以便在多次运行中获得相同的差异
epoch.set(Calendar.MILLISECOND, 0)