1900年以前JodaTime和Calendar之间的差异

时间:2011-01-13 12:47:19

标签: java datetime calendar jodatime

在使用JodaTime lib和java.util.Calendar时,我在过去的同一日期获得了不同的毫秒值。 例如AD的第一年

void test() {
    int year = 1;
    DateTime dt = new DateTime(year, 1,1,0,0,0,0);
    dt = dt.toDateTime(GregorianChronology.getInstance());

    Calendar cal = Calendar.getInstance();
    cal.clear();
    cal.set(year, 0, 1, 0, 0, 0);

    DateTime endDate = new DateTime(cal.getTimeInMillis());
    endDate = endDate.toDateTime(GregorianChronology.getInstance());

    System.out.println("JodaTime: " + dt);
    System.out.println("JodaTime, ms: " + dt.getMillis());
    System.out.println("Calendar: " + cal.getTime());
    System.out.println("Calendar, ms: " + cal.getTimeInMillis());
    System.out.println("JodaTime by Calendar: " + endDate);
}

默认情况下,DateTime使用ISOChronology,Calendar是GregorianCalendar(TH和JA语言环境除外)。所以我设置了格里高利年代学,但没有改变。 执行结果是

JodaTime:       0001-01-01T00:00:00.000+01:34:52
JodaTime, ms:   -62135602492000
Calendar:       Sat Jan 01 00:00:00 EET 1
Calendar, ms:   -62135776800000
JodaTime by Calendar:   0000-12-29T23:34:52.000+01:34:52

有人可能会说我错了吗?

2 个答案:

答案 0 :(得分:4)

我的猜测就是你的时区。指定UTC以从等式中删除。

某些时区(例如巴黎)有一些“有趣”的过渡。

例如,zoneinfo建议欧洲/雅典的偏差为1:34:52直到1916年(从1895年LMT缩写为AMT)。

白俄罗斯在1:80:16之间的偏差直到1880年。

也许Java正在使用不同的时区数据来源,但不包括这些奇怪的东西?

答案 1 :(得分:2)

在做了一些测试后,我发现了接下来的事情:

  1. 问题是我的代码是它使用欧洲/雅典时区。它已经偏移了2个小时,直到1916年,它曾经是相同的1:34:52(而不是Jon Jon Skeet的帮助)。但只有Joda Time知道它=)。这就是为什么我从1582年到1916年之间有所不同(不像我之前假设的1900年) 所以自1582年10月15日以来,Sun的日历和Joda Time的行为相似(如果你使用UTC时区)

  2. 但如果您尝试使用java.util.Calendar创建1582-10-14(cal.set(1582,9,14,0,0,0);)您将获得Sun Oct 24 00 :00:00 EET 1582(和Joda Time的正确日期)。对于05-14.10.1582也是如此。在1582-10-05之前,您将获得日历的正确字符串表示,但不同的毫秒值。并且差异因某种规则而变得更少。这就是为什么在我的例子中它是3天的滞后。据我记得它与朱利安日历有关

  3. 感谢大家的帮助