Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 新日期_Javascript - Fatal编程技术网

Javascript 新日期

Javascript 新日期,javascript,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

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)

因为“2014-06-12”似乎是一种没有时区的ISO 8601日期格式,所以大多数浏览器(但不是所有浏览器)都将其视为UTC(根据ES5)2014-6-12’被视为其他格式,因此被视为本地格式

ES6将改变这一点,因此没有时区的ISO 8601日期应被视为本地日期(根据ISO 8601)。困惑的 ECMAScript 2015最初被解释为将ISO 8601仅日期表单视为本地表单,但后来被更改为将其视为UTC。ECMAScript的所有后续版本也将其视为UTC(这与ISO 8601不一致)

因此,不要使用内置解析器解析字符串(即
newdate(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;
}
另请参见为什么相关:<代码>YYYY-MM-DD是的一个变体,当前默认为UTC。