Date.parse(0)返回2000年的午夜,为什么?

时间:2015-03-16 10:32:16

标签: javascript v8

当我尝试Date.parse()整数或字符串0时,它会返回 946681200000 ,这会转换为以下日期:

Sat Jan 01 2000 00:00:00 GMT + 0100(CET)

为什么?

我认为解析器会将单个零解释为2000年,但规格并未说明单字符年份定义 - RFC 2822ISO 8601需要四个字符的年份字符串。

我想更好地理解如何将字符串'0'解析为日期,为什么它被接受为有效日期(如果它不是NaN或某些?)以及为什么2000年是选择而不是例如1900年。

更新

经过一番试验&错误,我发现单个数字实际上在不同的数值范围内有不同的解释。

  • 0 - 12:2000年的一个月
  • 13 - 31:NaN
  • 32 - 49:一年+ 2000,所有其他值设置为默认值
  • 50 - 99:一年+ 1950,所有其他值都设为默认值
  • 100 - ??:一年,所有其他值设置为默认值

2 个答案:

答案 0 :(得分:8)

  

规范没有提及单字年定义

The spec说:

  

如果String不符合that format,则该函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式。

对于V8,请使用单个号码查看this bug report有关不可预知结果的信息。您也可以直接阅读来源(dateparser.ccdateparser.hdateparser-inl.h)。

答案 1 :(得分:0)

正如Bergi正确指出的那样,规范将其留给实现,以便在它不是标准格式之一时返回日期。

以下是它在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)返回946665000000

Sat Jan 01 2000 00:00:00

Date.parse(49)返回2493052200000

Fri Jan 01 2049 00:00:00

Date.parse(50)返回-631171800000

Sun Jan 01 1950 00:00:00

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

Firefox会针对所有这些情况返回NaN