新日期(2012年,01,01)与新日期不同(2012 01 01)

Cod*_*niu 0 javascript

在chrome控制台中,

new Date('2012 01 01') 输出: Sun Jan 01 2012 00:00:00 GMT-0600 (Central Standard Time)

new Date(2012, 01, 01) 输出: Wed Feb 01 2012 00:00:00 GMT-0600 (Central Standard Time)

我真的很好奇为什么会这样.

有人想照亮一些光吗?

T.J*_*der 5

我想你的意思是:

new Date('2012 01 01');
new Date(2012, 01, 01); // Note the commas
Run Code Online (Sandbox Code Playgroud)

原因是上面的第二个例子使用Date接受数字而不是字符串构造函数的版本, JavaScript中的月份数字从0 = 1月开始.因此new Date(2012, 1, 1)(0您的示例中的前导在技​​术上是错误,但大多数引擎允许它并将数字视为八进制)是2012年2月 1日.

上面的第一个版本使用Date带有字符串并解析它的构造函数,并且在解析日期字符串时,月份数通常从1 = 1月开始.请注意,您要求Chrome解析的字符串不是规范定义的任何格式,其他引擎可能无法解析它.实际上,在ECMAScript 5之前,没有定义的日期字符串格式(Date接受字符串的构造函数被定义为接受任何toString输出,但实际上都没有指定).ECMAScript 5添加了ISO-8601的简化版本.但在野外,过去十年中的每个引擎都支持表单中的日期字符串yyyy/mm/dd(但不一定是现在指定的日期字符串yyyy-mm-dd).

  • @zerkms:`0`是JavaScript中的有效十进制数,`01`不是.数字文字只能以"0"开头,如果是"0",或者"0"后跟"x",余数是十六进制.[规范的§7.8.3](http://ecma-international.org/ecma-262/5.1/#sec-7.8.3)涵盖了这一点.许多JavaScript引擎扩展了JavaScript数字文字的定义,允许前导零表示八进制(同一语法族中的许多其他语言,从B语言派生出来),但它不是标准的,严格禁止模式. (2认同)