为什么时间戳((长)-62135596800000L)返回0001-01-03 00:00:00 ,但必须返回 0001-01-01 00:00:00 ?此服务显示正确的时间戳here
答案 0 :(得分:13)
-62135596800000
是0001-01-03 00:00:00.0因为by default java uses Julian calendar for dates before October 15, 1582。
您正在使用的网站使用的是javascript,它使用外推或预知的公历日历表示所有日期。来自javascript specification
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天,因为根据this, 从公元前1年到公元100年,朱利安在2天之前领先于格列高利。
顺便说一下,我建议使用JodaTime
,它正确(我的意见,though if you need something more convincing)默认为纯格里高利:
DateTime dt = new DateTime(-62135596800000L, DateTimeZone.UTC);
System.out.println(dt.toString());
//0001-01-01T00:00:00.000Z