Java 1900年前的JodaTime和日历之间的差异

Java 1900年前的JodaTime和日历之间的差异,java,datetime,calendar,jodatime,Java,Datetime,Calendar,Jodatime,在使用JodaTime lib和java.util.Calendar时,我得到了过去相同日期的不同毫秒值。 比如第一年的广告 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();

在使用JodaTime lib和java.util.Calendar时,我得到了过去相同日期的不同毫秒值。 比如第一年的广告

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使用等时线,日历为GregoriaCalendar(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
有人能告诉我我有什么地方不对吗?

我想这与你的时区有关。指定UTC以将其从方程式中删除

一些时区(如巴黎)发生了一些“有趣”的转变

例如,zoneinfo指出欧洲/雅典在1916年之前的偏移量为1:34:52(1895年从LMT的缩写转换为AMT)

白俄罗斯在1880年之前的偏移量为1:50:16


也许Java使用的时区数据源不包括这些奇怪的东西?

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

  • 问题是我的代码使用的是欧洲/雅典时区。Atm的偏移量为2小时,在1916年之前,它的偏移量为1:34:52(thanx Jon Skeet寻求帮助)。但只有乔达时代知道这件事。这就是为什么我从1582年到1916年(不像我以前想象的那样是1900年)都有不同 因此,自1582-10-15年以来,太阳的日历和约达时间的行为相似(如果使用UTC时区)

  • 但如果您尝试使用java.util.Calendar(cal.set(1582,9,14,0,0,0);)创建1582-10-14,您将获得Sun Oct24 00:00:00 EET 1582(以及Joda Time中的正确日期)。1582年10月5日至14日也是如此。在1582-10-05之前,您将获得日历的正确字符串表示形式,但毫秒值不同。根据某种规则,这种差异会越来越小。这就是为什么在我的例子中是3天的延迟。据我记忆所及,它与朱利安历法有关


  • 谢谢大家的帮助

    你猜得不错。时间在公元1年并不一致。在我看来,乔达比日历更聪明。听起来很合理。我检查了DateTime和Calenar的实例是否具有相同的时区,但没有尝试更改它们(我刚刚打印了时区)。我会试试UTC,谢谢你,Jon。@Erick:我们的日历并不总是适用于它开始之前的日期,这意味着我们真的没有明智的方法来做到这一点。Sun/Oracle JRE和Joda Time都使用tz数据库。但他们可能使用不同的版本。我试过UTC,它澄清了1582年以来的一切——日历和日期时间是相同的,25分钟的差异是因为偏移量。但看起来1582年以前的太阳历和约达时间的实现方式不同(我想原因是闰年1200、800和400),使用
    GregorianCalendar
    表示1582年之前的日期总体上是相当可疑的…根据GregorianCalendar javadoc it“执行公历和儒略历。也就是说,日期是通过无限期地向后和向前推断当前规则来计算的。因此,GregorianCalendar可用于所有年份,以产生有意义且一致的结果。然而,使用格里高利安历法获得的日期只有在公元4年3月1日以后才具有历史准确性,当时采用了现代朱利安历法规则。“但我认为这是答案。问题出在1582年之前。值得注意的是,虽然公历是1582年引入的,但许多国家直到很久以后才正式使用公历。有些不到100年前。在美国,当他们获得独立时,它被追溯采用。乔治·华盛顿一生中改变了他的出生年份、月份和日期。1751年《英国历法》宣布1752年9月2日后的第二天为9月14日。