Javascript新日期

时间:2014-06-19 21:09:56

标签: javascript

JavaScript中有一件有趣的事情,不是什么大不了的事,但我想知道,为什么会这样。

如果你这样做:

new Date('2014-6-12')

你会得到:

Thu Jun 12 2014 00:00:00 GMT-0600 (Central America Standard Time)

这是完全没问题,但是如果你使用格式' dd'而不是' d'像这样:

new Date('2014-06-12')

你会得到不同的结果:

Wed Jun 11 2014 18:00:00 GMT-0600 (Central America Standard Time)

1 个答案:

答案 0 :(得分:4)

由于“2014-06-12”似乎是没有时区的ISO 8601日期格式,因此大多数浏览器都将其视为UTC(每ES5),但不是全部。 '2014-6-12'被视为其他格式,因此被视为本地格式。

ES6会更改这一点,以便ISO 8601没有时区的日期应被视为本地(根据ISO 8601)。困惑? ECMAScript 2015最初被解释为仅将ISO 8601日期形式视为本地,但已将其更改为将其视为UTC。所有后续版本的ECMAScript也将它们视为UTC(与ISO 8601不一致)。

因此,不要使用内置解析器(即new Date(string)Date.parse(string))解析字符串,其行为在浏览器中不一致,并且不一定符合标准。使用库,或编写自己的简单解析器:

// Expect year-month-day, treat as local date
function parseYMD(s) {
  var b = s.split(/\D+/);
  return new Date(b[0], --b[1], b[2]);
}

以上很简单但不测试日期是否有效,为此需要额外的一行:

// Expect year-month-day, treat as local date
function parseYMD(s) {
  var b = s.split(/\D+/);
  var d = new Date(b[0], --b[1], b[2]);
  return d && d.getFullYear() == b[0] && d.getDate() == b[2]? d : NaN;
}

另请参阅为什么Date.parse give incorrect results?