代码之家  ›  专栏  ›  技术社区  ›  kevinarpe Dario Hamidi

chrome 66:date.parse()为无效的iso 8601日期提供意外结果

  •  0
  • kevinarpe Dario Hamidi  · 技术社区  · 6 年前

    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?

    1 回复  |  直到 6 年前
        1
  •  2
  •   T.J. Crowder    6 年前

    javascript Date 对象很高兴为您处理单元翻转,这就是 2018-06-31 示例-它处理从6月30日到7月1日的展期。

    这不是为了 2018-06-32 例子是因为 32 是days字段的无效值(而31不是,只是六月只有30天)。规范定义日期/时间字符串部分的有效范围。 here ,其中我们可以看到它表示该月的日期的有效值为01到31(包括01到31)。


    值得注意的是,如果不包含时区指示器,解析ISO-8601派生格式(它不是ISO-8601,相当)有一个有缺陷的历史。ES5指定了ISO-8601,但得到了时区指示器错误的含义(它说它应该意味着UTC,但ISO-8601表示它意味着本地时间);然后ES2015试图修复它,但是符合ES2016的规则将破坏大量的真实世界代码;因此,直到ES2016,它才稳定下来。(如你的)没有时区指示器是UTC,日期/时间表没有一个是本地时间。(如果你 包括时区指示器。