2016-08-22 77 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