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

Rob*_*ann 6 javascript v8

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

周一01 01 01 00:00:00 GMT + 0100(CET)

为什么?

我假设解析器将单个零解释为2000年,但规格并未说明单字符年份定义 - RFC 2822ISO 8601都要求字符串中包含四个字符的年份.

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

更新

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

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

Ber*_*rgi 8

规范没有说明单字年定义

规范说:

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

对于V8,请使用单个数字查看有关不可预测结果的错误报告.您也可以直接读取源代码(dateparser.cc,dateparser.h,dateparser-inl.h).