Date.parse(0) returns 2000 年午夜,为什么?

Date.parse(0) returns midnight of 2000, why?

当我尝试 Date.parse() 一个整数或字符串 0 时,它 returns 946681200000,转换为日期:

2000 年 1 月 1 日星期六 00:00:00 GMT+0100 (CET)

为什么?

我假设解析器将单个零解释为 2000 年,但规范没有说明单字符年份定义 - RFC 2822 and ISO 8601 都要求字符串中有四个字符的年份。

我想更好地理解字符串“0”是如何被解析为日期的,为什么它被接受为有效日期(它不应该是 NaN 或类似的日期吗?)以及为什么是年份选择 2000 而不是例如 1900。

更新

经过反复试验,我发现单个数字实际上在不同的数字范围内有不同的解释。

the specs say nothing about single-character year definition

The spec 说:

If the String does not conform to that format the function may fall back to any implementation-specific heuristics or implementation-specific date formats.

对于 V8 具体而言,请参阅 this bug report on unpredictable results when called with a single number. You can also read the source directly (dateparser.cc, dateparser.h, dateparser-inl.h)。

正如 Bergi 正确指出的那样,规范将它留给了实现 return 它不是标准格式之一的日期。

以下是它在 Chromium 的 V8 引擎中的实现方式:

DateParser.cc

if (!is_iso_date_) {
if (Between(year, 0, 49)) year += 2000;
else if (Between(year, 50, 99)) year += 1900;
}

在 Chrome 41.0.2272.76 :

Date.parse(0) returns 946665000000Sat Jan 01 2000 00:00:00

Date.parse(49) returns 2493052200000Fri Jan 01 2049 00:00:00

Date.parse(50) returns -631171800000Sun Jan 01 1950 00:00:00

(翻译时间为 GMT+5.30;毫秒值将根据您所在的时区而变化)

Firefox returns NaN 所有这些情况。