Date.parse(0) 返回 2000 的午夜,为什么
Date.parse(0) returns midnight of 2000, why?
当我尝试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
。
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 为什么“;未定义的“;在JavaScript中结束循环
- 为什么这在IE中的工作方式与在Firefox中不同
- 知道为什么我的旋转木马不会自动更改图片吗
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 为什么在单独的函数中应用时转换会闪烁/断断续续(D3)
- 为什么在变形之前不缺少Fx
- 为什么JavaScript在for循环为3时向所有4发出警报
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- 为什么Airbnb风格指南说不鼓励依赖函数名称推断
- 为什么要使用0>javascript中的0
- 为什么无法在TypeScript中导出类实例
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 为什么我的d3.jsselectAll+过滤器没有过滤
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- 为什么忽略了eval()代码中的语法错误
- 为什么在画布上画线;t出现
- 为什么js事件消失了
- 为什么元素的宽度在页面加载之后和那一刻之后不同
- Date.parse(0) 返回 2000 的午夜,为什么