5

为什么Timestamp((long)-62135596800000L) 返回 0001-01-03 00:00:00,但必须返回0001-01-01 00:00:00此服务在此处显示正确的时间戳

在此处输入图像描述

4

1 回答 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

不幸的是,我不知道如何执行从CalendarDate对象的公历更改,所以我直接从日历对象进行格式化。如果我只是这样做 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 回答