Chrome 66:Date.parse()为无效的ISO 8601日期提供了意外的结果

时间:2018-06-19 11:33:01

标签: javascript google-chrome

具有香港时区的Chrome 66调试控制台的输出:

有效日期:

compute2

无效日期给出T + 1值!

VkBuffer

最后...和无效的日期错误。

VkDeviceMemory

为什么6月31日会给T + 1?

1 个答案:

答案 0 :(得分:2)

JavaScript Date对象很乐意为您处理单位转换,这就是2018-06-31示例的全部工作-它正在处理6月30日至7月1日的转换。

对于2018-06-32示例,它没有这样做,因为32对于days字段是无效的值(而31不是,而6月只有30天)。规范定义了日期/时间字符串here的各个部分的有效范围,在该范围中我们可以看到它表示该月中某天的有效值是01到31(含)。


遗憾的是,如果您不包括时区指示符,则对ISO-8601派生格式(不是ISO-8601)的解析可能值得一提。 ES5指定了ISO-8601,但没有时区指示符的含义错误(它表示应该表示UTC,但ISO-8601表示它表示本地时间);然后,ES2015试图解决此问题,但遵循ES2016的规则将破坏大量的实际代码;因此直到ES2016才稳定下来,它说:没有时区指示符的仅日期格式(如您的格式)是UTC,没有日期/时间格式的是本地时间。 (如果您包含时区指示符,那么多年没事了。)