时间戳显示错误的数据

时间:2012-12-02 10:55:16

标签: java android date timestamp

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

enter image description here

1 个答案:

答案 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

不幸的是我不知道如何执行从CalendarDate对象的格里高利变换,所以我直接从日历对象进行格式化。如果我这样做的话 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