我遇到了一些奇怪的行为,虽然我对此并没有真正的问题,但我想知道其背后的原因。
我写了以下声明:
console.log(new Date("0000-1-1"));
console.log(new Date("0000-01-01"));
console.log(new Date("0000-01-01T00:00:00Z"));
console.log(new Date(0, 0, 1));
Run Code Online (Sandbox Code Playgroud)
虽然所有日期“看起来”相似,并且如果您使用正常的日/月/年表现相同,但在这种情况下却并非如此。
结果如下:
Sat Jan 01 2000 00:00:00 GMT+0100 (CET)
Sat Jan 01 0 01:00:00 GMT+0100 (CET)
Sat Jan 01 0 01:00:00 GMT+0100 (CET)
Mon Jan 01 1900 00:00:00 GMT+0100 (CET)
Run Code Online (Sandbox Code Playgroud)
这对我来说很有趣。我同意最后一个观点,因为JavaScript 规范明确规定了以下内容:
年
代表年份的整数值。0 到 99 之间的值映射到 1900 到 1999 年。请参见下面的示例。
我还可以理解第二个和第三个结果,因为这取决于RFC 2822。他们确实接受4*DIGITS年份,因此0000RFC 规范中的年份应该是 0(不过我没有完全阅读它)。
只是有点奇怪的是,其中一个Date构造函数可用于 1900 年以上的日期,而另一个构造函数允许更广泛的日期 (RFC)。
但是,我不明白第一个结果。2000年从何而来?我确实知道该日期并不是真正合适的日期,但它不应该返回Invalid Date而不是这个日期吗?