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

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

本文关键字:午夜 为什么 2000 返回 parse Date      更新时间:2023-09-26

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

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

为什么?

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

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

更新

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

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

规范没有说明单字符年份定义

规范说:

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

特别是对于 V8,请参阅此错误报告,了解使用单个数字调用时不可预测的结果。您也可以直接读取源代码(dateparser.cc,dateparser.h,dateparser-inl.h)。

正如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