2009-10-02 92 views
44

我被玩弄的JavaScript創建一個簡單的倒計時鐘,當我遇到這種奇怪的行爲傳來:Javascript Date.UTC()函數已關閉一個月?

var a = new Date(), 
now = a.getTime(), 
then = Date.UTC(2009,10,31), 
diff = then - now, 
daysleft = parseInt(diff/(24*60*60*1000)); 
console.log(daysleft); 

剩下的日子是過了30天。

這段代碼有什麼問題?

編輯:我改變了變量名稱使其更清晰。

+0

相關:http://stackoverflow.com/q/20806052/1048572 – Bergi

回答

85

這個月對於JavaScript來說是從零開始的。

天和年是一個基礎。

去圖。

UPDATE

其原因是這樣,從creator of JavaScript,是

JS had to "look like Java" only less so, be Java's dumb kid brother or boy-hostage sidekick. Plus, I had to be done in ten days or something worse than JS would have happened.

http://www.jwz.org/blog/2010/10/every-day-i-learn-something-new-and-stupid/#comment-1021

+13

哈。謝謝。這意味着我終究不會失去理智。 – picardo

+3

很好的引用,但Eich在那裏談論整數。以下是關於Date的部分:*「我只爲jsdate.c提供幫助,來自Netscape的Ken Smith(根據我們的過度樂觀協議,克隆了java.util.Date - Y2K bug和所有!Gosling ...)「* – user123444555621

6

正如埃裏克說,這是由於被月列爲0-11範圍。

這是一種常見行爲 - localtime()和其他許多語言的perl結果也是如此。

這很可能最初是從Unix的localtime()調用繼承而來的。 (做「人本地時間」)

原因是,日/年是他們自己的整數,而月(作爲#)是一個數組的索引,在大多數語言 - 特別是C底層調用實現在Unix上 - 從0開始。

-2
date1 = new Date(); 
//year, month, day [, hrs] [, min] [, sec] 
date1 = new Date.UTC(date1.getFullYear(),date1.getMonth()+1,date1.getDate(),date1.getHours(),date1.getMinutes(),date1.getSeconds()); 

date2 = new Date(); 
date2 = date2.getTime(); 

alert(date1) 
alert(date2) 
+0

我不確定你在這裏做了什麼,並且代碼沒有運行('TypeError:function UTC(){[native code]}不是構造函數')。 –