为什么Timestamp((long)-62135596800000L) 返回 0001-01-03 00:00:00,但必须返回0001-01-01 00:00:00?此服务在此处显示正确的时间戳
问问题
4926 次
1 回答
13
-62135596800000
是 0001-01-03 00:00:00.0 因为默认情况下 java 使用儒略历来表示 1582 年 10 月 15 日之前的日期。
您正在使用的网站使用 javascript,它对所有日期使用外推或预测的公历。来自javascript 规范
ECMAScript 使用外推公历系统将日期编号映射到年份编号,并确定该年份的月份和日期。
事实上,在 javascript 中:
new Date(-62135596800000).toUTCString()
//"Mon, 01 Jan 1 00:00:00 GMT"
您可以在 java 中使用类似的东西来获得相同的结果:
GregorianCalendar date = new GregorianCalendar();
date.clear();
//Use Gregorian calendar for all values
date.setGregorianChange(new Date(Long.MIN_VALUE));
date.setTimeZone( TimeZone.getTimeZone("UTC"));
date.setTime(new Date(-62135596800000L));
System.out.println(
date.get(GregorianCalendar.YEAR) + "-" +
(date.get(GregorianCalendar.MONTH) + 1) + "-" +
date.get(GregorianCalendar.DAY_OF_YEAR) + " " +
date.get(GregorianCalendar.HOUR_OF_DAY) + ":" +
date.get(GregorianCalendar.MINUTE) + ":" +
date.get(GregorianCalendar.SECOND) + "." +
date.get(GregorianCalendar.MILLISECOND)
);
//Prints 1-1-1 0:0:0.0
不幸的是,我不知道如何执行从Calendar
到Date
对象的公历更改,所以我直接从日历对象进行格式化。如果我只是这样做
formatter.format(date.getTime())
,它将失去公历更改设置并再次显示第 3 天。
朱利安日期提前 2 天,因为据此,从公元前 1 年到公元 100 年,朱利安比预产期公历提前 2 天。
顺便说一句,我建议使用JodaTime
,它正确(我的意见,虽然如果你需要一些更有说服力的东西)默认为纯公历:
DateTime dt = new DateTime(-62135596800000L, DateTimeZone.UTC);
System.out.println(dt.toString());
//0001-01-01T00:00:00.000Z
于 2012-12-02T12:22:14.723 回答