一尘不染

JavaScript为什么Date.parse给出不正确的结果?

javascript

情况一:

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

输出:

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

案例二:

new Date(Date.parse("2005-07-08"));

输出:

Thu Jul 07 2005 17:00:00 GMT-0700(PST)


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


阅读 318

收藏
2020-04-22

共1个答案

一尘不染

在第5版规范发布之前,该Date.parse方法完全依赖于实现(除后者返回数字而不是a之外,其他方法new Date(string)等效)。在第5版规范中,添加了该要求以支持简化的(并且略有错误) ISO-8601(另请参见JavaScript中有效的日期时间字符串是什么?)。但是除此之外,除了必须接受任何Date#toString输出(不说那是什么)之外,对什么/ 应该接受没有任何要求。Date.parse(string)DateDate.parsenew Date(string)

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

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

  • ddd MMM DD YYYY HH:mm:ss ZZ [(时区名称)]
  • 例如Tue Jul 10 2018 18:39:58 GMT + 0530(IST)
  • ddd,DD MMM YYYY HH:mm:ss Z
    例如 2019年7月10日星期二13:09:58 GMT
    提供了Date.parse应该在新的实现中可靠地解析的另外2种格式(请注意,支持并不普遍,并且不兼容的实现将在一段时间内继续使用)。

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

// parse a date in yyyy-mm-dd format
function parseDate(input) {
  var 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
}
2020-04-22