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)
答案 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;
}