在使用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
有人可能会说我错了吗?
答案 0 :(得分:4)
我的猜测就是你的时区。指定UTC以从等式中删除。
某些时区(例如巴黎)有一些“有趣”的过渡。
例如,zoneinfo建议欧洲/雅典的偏差为1:34:52直到1916年(从1895年LMT缩写为AMT)。
白俄罗斯在1:80:16之间的偏差直到1880年。
也许Java正在使用不同的时区数据来源,但不包括这些奇怪的东西?
答案 1 :(得分:2)
在做了一些测试后,我发现了接下来的事情:
问题是我的代码是它使用欧洲/雅典时区。它已经偏移了2个小时,直到1916年,它曾经是相同的1:34:52(而不是Jon Jon Skeet的帮助)。但只有Joda Time知道它=)。这就是为什么我从1582年到1916年之间有所不同(不像我之前假设的1900年) 所以自1582年10月15日以来,Sun的日历和Joda Time的行为相似(如果你使用UTC时区)
但如果您尝试使用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天的滞后。据我记得它与朱利安日历有关
感谢大家的帮助