【发布时间】:2015-08-14 09:49:06
【问题描述】:
我遇到了一些奇怪的行为,虽然我对此并没有真正的问题,但我想知道它背后的原因。
我写了以下语句:
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));
虽然所有日期“看起来”相似,并且如果您使用正常的日/月/年表现相同,但在这种情况下并非如此。
结果如下:
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)
这对我来说很有趣。我可以同意最后一个,因为JavaScript spec 清楚地说明了以下内容:
年份
代表年份的整数值。从 0 到 99 的值映射到 1900 到 1999 年。请参见下面的示例。
我也可以理解第二个和第三个结果,因为这取决于RFC 2822。他们确实接受 4*DIGITS 作为一年,所以 0000 应该是 RFC 规范的第 0 年(虽然我没有完全阅读它)。
Date 构造函数之一可用于 1900 年以上的日期,而另一个构造函数允许范围更广 (RFC) 的日期,这有点奇怪。
但是,我不明白第一个结果。 2000年从何而来?我明白这个日期不是一个合适的日期,但它不应该返回Invalid Date 来代替这个日期吗?
【问题讨论】:
-
我假设你在 Chrome 中测试过它。顶部的
new Date("0000-1-1")在不同的浏览器中有所不同。在 Firefox 中它输出一个无效日期,在 IE 中它输出Dec 01 1900。 -
正如 A1rPin 所指出的,这似乎是特定于 Chrome 的。这是 V8 日期解析器的代码,可能包含一些线索:github.com/v8/v8-git-mirror/blob/master/src/dateparser-inl.h
-
啊,是的,对不起,我在 Chrome 中测试过 :) 应该在其他浏览器中测试过。
-
以毫秒为单位的日期可用于一致性
new Date(-621672192e5),或new Date("0000"),至少4位数年份
标签: javascript date