2015-04-17 79 views
18

測試:如何解釋Date構造函數中的差異?

var d1 = new Date("2000-04-22T00:00:00+00:00"); 
var d2 = new Date(2000, 4, 22, 0, 0, 0, 0); 
console.log("d1 = " + d1.getTime()); 
console.log("d2 = " + d2.getTime()); 

結果:

d1 = 956361600000 
d2 = 958946400000 

我認爲差異來自時區,但我完全不明白!

什麼神奇的東西產生這種差異?

+2

這是因爲時區 – epascarello

+2

使用'新的Date(Date.UTC(2000,4, 22,0,0,0,0));'得到預期的結果。 – Bergi

+0

這解決了UTC問題,正確的月份索引它變成了'新日期(Date.UTC(2000,3,22,0,0,0,0));'它工作! –

回答

12

最大的問題是,在JavaScript中,月份是0索引,在創建你的第二個日期實例,4意味着5月。此外,您的字符串包含+00:00用於時區目的,即UTC/GMT。你的第二個沒有提供時區信息,所以它將是當地的時區。

如果你想有一個UTC日期構造類似於你怎麼過的,你可以撥打:

var d2 = new Date(Date.UTC(2000, 3, 22, 0, 0, 0, 0)); 
+0

'UTC'不是構造函數 – Bergi

+0

謝謝,修正,忘記包裹在Date中。 – JBzd

19

您的ISO日期字符串具有明確的UTC時區,因此它被解釋爲UTC。第二個日期是用日期部分的數字參數構建的,並且構建日期的方式隱式使用本地時區。

另請注意,日期字符串中的「4」表示「April」,而第二個構造函數中的「4」表示「May」:使用數字構造函數時,月份從零開始編號,而不是一個。

+1

我們再次見面,而且你還*很棒。 –

4

我覺得這是最好的described in the documentation

注:圖中日期被稱爲具有一個以上參數的構造,爲指定的參數代表本地時間。如果需要UTC,則使用具有相同參數的新Date(Date.UTC(...))。

換句話說,當你使用字符串構造函數時,你會得到UTC。當您使用構造函數創建一個時,您將獲得正常的語言環境。