我正在将时间与使用2000.01.01作为其时代的外部系统进行转换。自历元开始以来,我需要毫秒进行各种计算,因此我使用常数在两者之间进行转换(忽略leap秒等的细微差别;我的常数可能并不精确,但暂时不重要)。在测试的同时,我注意到时间转换很奇怪。
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。
您可以如下将其分别设置为零,以在多次运行中获得相同的差异
epoch.set(Calendar.MILLISECOND, 0)
关于java - 自历元以来的时间不稳定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19427654/