案例一:

new Date(Date.parse("Jul 8, 2005"));

输出:

2005 年 7 月 8 日星期五 00:00:00 GMT-0700 (PST)

案例二:
new Date(Date.parse("2005-07-08"));

输出:

2005 年 7 月 7 日星期四 17:00:00 GMT-0700 (PST)

为什么第二次解析不正确?

最佳答案

在第 5 版规范出来之前, Date.parse 方法完全依赖于实现(new Date(string) 等价于 Date.parse(string) ,除了后者返回一个数字而不是 0x2518122311343)。在第 5 版规范中,增加了支持 simplified (and slightly incorrect) ISO-8601(另见 What are valid Date Time Strings in JavaScript?)的要求。但除此之外,没有要求 Date/Date.parse 应该接受什么,除了他们必须接受任何 new Date(string) 输出(不说那是什么)。

从 ECMAScript 2017(第 8 版)开始,实现需要解析 Date#toStringDate#toString 的输出,但未指定这些字符串的格式。

从 ECMAScript 2019(第 9 版)开始, Date#toUTCString Date#toString 的格式已指定为(分别):

  • ddd MMM DD YYYY HH:mm:ss ZZ [(时区名称)]例如2018 年 7 月 10 日星期二 18:39:58 GMT+0530 (IST)
  • ddd, DD MMM YYYY HH:mm:ss Ze.g. 2018 年 7 月 10 日星期二 13:09:58 GMT

  • 提供另外 2 种格式,Date#toUTCString 应该在新的实现中可靠地解析(注意支持并不普遍,不合规的实现将继续使用一段时间)。

    我建议手动解析日期字符串,并将 Date constructor 与年、月和日参数一起使用以避免歧义:

    // parse a date in yyyy-mm-dd format
    function parseDate(input) {
    
      let parts = input.split('-');
    
      // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
      return new Date(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based
    }
    

    关于javascript - 为什么 Date.parse 给出不正确的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2587345/

    10-12 12:57
    查看更多