2013-10-17 13 views
0

我正在将时间转换为使用2000.01.01作为其时代的外部系统。我需要毫秒以来的纪元进行各种计算,所以我通过使用常数(忽略闰秒等的细微差别等;我的常数可能不是确切的,但现在并不重要)之间进行转换。虽然测试,我注意到时间转换的怪异。GregorianCalendar自从时代以来不稳定的时间

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) 

但是,如果你在一个新的虚拟机再次运行和重新的价值不断变化(貌似)随机!我只是跑它在不同的JVM快速连续5次,得到不同的结果:

-276 
-612 
-376 
-458 
-573 

我重做与不同的时区的测试,并得到了同样的问题。

有没有人有任何想法可能会导致此?

回答

2

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

您可以分别设置相同的零如下得到多次运行相同的差异

epoch.set(Calendar.MILLISECOND, 0) 
+0

Argghh我不能相信我错过了这一点。谢谢。 –