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