2013-02-20 87 views
6

這是怎麼回事:爲什麼JavaScript的解釋這些相同的日期不同

> new Date('Apr 15 2013'); 
Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time) 
> new Date('04/15/2013'); 
Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time) 
> new Date('2013-04-15'); 
Mon Apr 15 2013 01:00:00 GMT+0100 (GMT Daylight Time) 

顯然,一個被解釋爲UTC時間,而其他兩個被解釋爲本地時間。什麼導致解析中的差異?

回答

2

specification

該串可以被解釋爲本地時間,UTC時間,或在一些其它時間區的時間,這取決於字符串的內容。該函數首先嚐試根據日期時間字符串格式(15.9.1.15)中調出的規則解析字符串的格式。如果字符串不符合該格式,該函數可能會回退到任何特定於實現的啓發式或實現特定的日期格式。

您所提供的所有格式中,只有'2013-04-15'被正式支持,所以其他人似乎回落到實現相關的行爲。

+0

那麼我從MDN文檔中引用的部分是由什麼組成的? – Eric 2013-02-20 09:59:33

+1

您從MDN引用的部分可能會詳述Gecko實施行爲(因爲正如規範所示,此情況由實施決定)。 – 2013-02-20 10:00:38

+1

@Eric:它可以是Firefox的實現細節,也可以是非官方的,但廣泛支持的功能。 Chrome瀏覽器似乎行爲相同,所以它可能是後者。 – 2013-02-20 10:01:12

2

Date構造委託給Date.parse,並且看起來Date.parse有兩個變種:

給定一個表示時間的字符串,解析返回的時間價值。它接受RFC2822/IETF日期語法(RFC2822第3.3節),例如, 「星期一,1995年12月25日13:30:00 GMT」。它瞭解大陸US 時區縮寫,但對於一般用途,請使用時區偏移量,例如,「星期一,1995年12月25日13:30:00 GMT + 0430」(東部時間4小時30分鐘 )格林威治子午線)。 如果您未指定時區,則 將假定當地時區爲。 GMT和UTC被認爲是等同的。

或者,日期/時間字符串可以是 ISO 8601格式。從JavaScript 1.8.5(Firefox 4)開始,支持ISO 8601的子集 。例如, 「2011-10-10」(只是日期)或 「2011-10-10T14:48:00(日期和時間)可以被傳遞並解析

顯然,這些不同的表現相對於。當地時區


編輯:看起來這是implementation defined

2

你的第三個例子是,實際上是在規範中解釋只有一個當你調用Date構造帶一個參數,this is what happens(其中v是傳遞給構造的字符串):爲一個日期

解析v,以完全相同的方式作爲用於parse方法(15.9.4.2);讓V爲該日期的時間值。

parse method將試圖解析字符串(強調):

該串可以被解釋爲本地時間,UTC時間,或者以其他時區的時間,這取決於關於字符串的內容。該函數首先根據日期時間字符串格式(15.9.1.15)中調出的規則嘗試解析字符串的格式。

如果字符串不符合該格式,該函數可能會回退到任何實現特定的啓發式或實現特定的日期格式

與「Date Time String Format」是YYYY-MM-DDTHH:mm:ss.sssZ,並且還定義形式YYYY-MM-DD,這是你在你的第三個例子使用的更短的版本。

對於其他示例,解析將失敗並且行爲是實現定義的。

相關問題