Java和Javascript之间的区别在1月1日0001 UTC

Xav*_*tte 5 javascript java date utc

我对Java和Javascript中的日期1月1日UTC的表示方式有所不同

在Java中:

TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
Calendar cal = Calendar.getInstance(utcTimeZone);
cal.clear();
//1st Jan 0001
cal.set(1, 0, 1);
Date date = cal.getTime();
System.out.println(date);//Sat Jan 01 00:00:00 GMT 1
System.out.println(date.getTime());// -62135769600000
Run Code Online (Sandbox Code Playgroud)

在JavaScript中:

var date = new Date();
date.setTime(-62135769600000);
date.toUTCString(); //"Sat, 30 Dec 0 00:00:00 GMT"
Run Code Online (Sandbox Code Playgroud)

为什么日期,1月1日0001 UTC,由Java中的时间-62135769600000L表示,在Javascript中显示时不表示为1月1日?

Jon*_*eet 10

看起来这是因为GregorianCalendar在Java中实际上是公历和儒略历之间的混合:

GregorianCalendar是一个混合日历,支持Julian和Gregorian日历系统,并支持单个不连续性,默认情况下对应公历日历时的格里高利日期(1582年10月15日,某些国家,后来其他国家).调用者可以通过调用setGregorianChange()来更改切换日期.

例如,如果以1500-01-01为例,Java和Javascript值将相隔10天.

为了使它成为纯粹的GregorianCalendar,你可以使用这个:

GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setGregorianChange(new Date(Long.MIN_VALUE));
Run Code Online (Sandbox Code Playgroud)

那么你得到0001-01-01的值为-62135596800000,它给出了Javascript的相同日期.

切换日历是颈部的痛苦 - 它们使各种事物变得奇怪,并且几乎从不有用.(我怀疑它们合适的用例可能有不同的要求.我最终决定不为Noda Time实现它:)