Java 1900年前的JodaTime和日历之间的差异
在使用JodaTime lib和java.util.Calendar时,我得到了过去相同日期的不同毫秒值。 比如第一年的广告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();
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使用的时区数据源不包括这些奇怪的东西?在做了一些测试之后,我发现了接下来的事情:
谢谢大家的帮助你猜得不错。时间在公元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日。