0

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

有效日期:

new Date('2018-06-30')
Sat Jun 30 2018 08:00:00 GMT+0800 (China Standard Time)

无效日期给出 T+1 值!

new Date('2018-06-31')
Sun Jul 01 2018 08:00:00 GMT+0800 (China Standard Time)

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

new Date('2018-06-32')
Invalid Date

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

4

1 回答 1

2

JavaScriptDate对象很乐意为您处理单元翻转,这就是2018-06-31示例的全部内容 - 它正在处理从 6 月 30 日到 7 月 1 日的翻转。

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


可能值得注意的是,如果您不包含时区指示符,那么对 ISO-8601 派生格式(完全不是 ISO-8601)的解析具有曲折的历史记录,遗憾的是。ES5 指定了 ISO-8601,但错误地理解了缺少时区指示符的含义(它说它应该表示 UTC,但 ISO-8601 说它表示本地时间);然后 ES2015 试图解决这个问题,但符合 ES2016 的规则会破坏大量的真实世界代码;所以它直到 ES2016 才稳定下来,它说:没有时区指示符的仅日期形式(如你的)是 UTC,没有时区指示符的日期/时间形式是本地时间。(如果您确实包含时区指示器,多年来一直很好。)

于 2018-06-19T11:37:15.880 回答