2016-08-22 73 views
3

这里的控制台输出:这些日期为什么不同?

new Date(2016, 08, 22) 
Thu Sep 22 2016 00:00:00 GMT+0200 (CEST) 

new Date("2016, 08, 22") 
Mon Aug 22 2016 00:00:00 GMT+0200 (CEST) 

不同的月份,但为什么呢?

+2

不同的构造函数正在被调用,因此不同的日期注释:月份以'0开始,所以当使用'New Date(Year,month,date)'为月份添加+1 – Satpal

+0

@ Satpal时 - 完全使用相同的构造函数[*日期*](http://ecma-international.org/ecma-262/7.0/index.html#sec-properties-of-the-date-constructor))。区别在于它如何处理单个字符串参数与数字参数的对比。 – RobG

回答

7

Javascript的月份是0的数字大小写,但在字符串解析08映射到8月,因为它是标准日期格式的“八月”的字符串翻译。 Date被以不同的方式被调用如所提here

  1. 新日期();
  2. new Date(value);
  3. new Date(dateString);
  4. new Date(year,month [,day [,hour [,minutes [,seconds [,milliseconds]]]]]);

在你的情况下,3 & 4格式被调用。

>> new Date(2016, 08, 22) 
>> Thu Sep 22 2016 00:00:00 GMT+0530 (IST) 
>> new Date(2016, 01, 22) 
>> Mon Feb 22 2016 00:00:00 GMT+0530 (IST) 
>> new Date(2016, 0, 22) 
>> Fri Jan 22 2016 00:00:00 GMT+0530 (IST) 
>> new Date("2016-08-22") 
>> Mon Aug 22 2016 05:30:00 GMT+0530 (IST) 
>> new Date("2016/08/22") 
>> Mon Aug 22 2016 00:00:00 GMT+0530 (IST) 
  • @从注释RobG输入:比ISO其他

...解析ofstrings 8601扩展格式完全 实现有关。解析“2016,08,22”的结果可能是任何事情,包括无效日期。

+1

您对字符串解析的评论应该包括除ISO 8601扩展格式之外的字符串解析完全取决于实施。解析“2016,08,22”的结果可能是任何事情,包括无效日期。 – RobG

2

使用意解析的日期的(已知的)字符串表示,像"Dec 25, 1995"第二Date构造函数。您传入的格式不是标准格式,因此即使结果接近正确的日期(并且可以通过更正月份值来修复,正如DhruvPathak所指出的那样),但不应将其用作结果,因为结果会有所不同在运行时/浏览器上。

+0

使用Date构造函数(或Date.parse)解析“1995年12月25日”可能会产生任何结果,包括无效日期。鉴于'新日期('1995年12月25日'),Firefox返回语法错误。 – RobG

+0

谢谢你指出。我再看看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse上的文档,其中指出:“如果字符串不符合标准格式,函数可能会回退到任何特定于实现的启发式或特定于实现的解析算法。“看起来像保证工作的唯一格式是ISO-8601; “可能会使用其他格式,但结果可能会出乎意料”。 –

+0

“* may well *”应该是“will”。即使ISO 8601没有得到完全或一致的支持(当然不能保证工作),并且ECMA-262本身在解析ISO 8601日期时与标准不同。底线是始终为字符串使用解析器,并始终指定要解析的格式。 – RobG