时间戳显示错误的数据

Igo*_*nko 5 java android timestamp date

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

在此输入图像描述

Esa*_*ija 13

-62135596800000是0001-01-03 00:00:00.0因为默认情况下,java使用Julian日历表示1582年10月15日之前的日期.

您正在使用的网站使用javascript,它使用外推或预知的公历日历.从javascript规范

ECMAScript使用外推格里高利系统将日期数字映射到年份数字,并确定该年份内的月份和日期.

的确,在javascript中:

new Date(-62135596800000).toUTCString()
//"Mon, 01 Jan 1 00:00:00 GMT"
Run Code Online (Sandbox Code Playgroud)

你可以在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
Run Code Online (Sandbox Code Playgroud)

不幸的是我不知道如何将Gregorian更改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
Run Code Online (Sandbox Code Playgroud)