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。
更新
经过反复试验,我发现单个数字实际上在不同的数字范围内有不同的解释。
- 0 - 12:2000 年的一个月
- 13 - 31:
NaN
- 32 - 49:一年 + 2000,所有其他值设置为默认值
- 50 - 99:一年 + 1950,所有其他值设置为默认值
- 100 - ??:一年,所有其他值设置为默认值
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 引擎中的实现方式:
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 946665000000
即 Sat Jan 01 2000 00:00:00
Date.parse(49)
returns 2493052200000
即 Fri Jan 01 2049 00:00:00
Date.parse(50)
returns -631171800000
即 Sun Jan 01 1950 00:00:00
(翻译时间为 GMT+5.30
;毫秒值将根据您所在的时区而变化)
Firefox returns NaN
所有这些情况。
当我尝试 Date.parse()
一个整数或字符串 0
时,它 returns 946681200000,转换为日期:
2000 年 1 月 1 日星期六 00:00:00 GMT+0100 (CET)
为什么?
我假设解析器将单个零解释为 2000 年,但规范没有说明单字符年份定义 - RFC 2822 and ISO 8601 都要求字符串中有四个字符的年份。
我想更好地理解字符串“0”是如何被解析为日期的,为什么它被接受为有效日期(它不应该是 NaN
或类似的日期吗?)以及为什么是年份选择 2000 而不是例如 1900。
更新
经过反复试验,我发现单个数字实际上在不同的数字范围内有不同的解释。
- 0 - 12:2000 年的一个月
- 13 - 31:
NaN
- 32 - 49:一年 + 2000,所有其他值设置为默认值
- 50 - 99:一年 + 1950,所有其他值设置为默认值
- 100 - ??:一年,所有其他值设置为默认值
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 引擎中的实现方式:
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 946665000000
即 Sat Jan 01 2000 00:00:00
Date.parse(49)
returns 2493052200000
即 Fri Jan 01 2049 00:00:00
Date.parse(50)
returns -631171800000
即 Sun Jan 01 1950 00:00:00
(翻译时间为 GMT+5.30
;毫秒值将根据您所在的时区而变化)
Firefox returns NaN
所有这些情况。