【问题标题】:GregorianCalendar with erratic time since epoch自纪元以来时间不稳定的公历
【发布时间】:2013-10-25 23:57:23
【问题描述】:

我正在将时间与使用 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

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

有人知道是什么原因造成的吗?

【问题讨论】:

    标签: java timezone epoch gregorian-calendar


    【解决方案1】:

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

    您可以按如下方式分别将相同设置为零以在多次运行中获得相同的差异

     epoch.set(Calendar.MILLISECOND, 0)
    

    【讨论】:

    • Argghh 我不敢相信我错过了。谢谢。
    猜你喜欢
    • 2012-08-05
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2016-05-14
    • 2016-12-23
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多