2009-10-02 7 views
44

Ich spielte herum mit Javascript einen einfachen Countdown-Uhr zu schaffen, wenn ich auf dieses seltsame Verhalten kam:Javascript Date.UTC() Funktion ist um einen Monat ausgeschaltet?

ist
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); 

Die Tage nach links um 30 Tage.

Was ist falsch an diesem Code?

Edit: Ich habe die Variablennamen geändert, um es klarer zu machen.

+0

Verbunden: http://stackoverflow.com/q/20806052/1048572 – Bergi

Antwort

85

Der Monat ist für JavaScript nullbasiert.

Tage und Jahre sind one-based.

Gehen Sie Abbildung.

UPDATE

Der Grund, warum dies so ist, von der creator of JavaScript ist

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

Ha. Vielen Dank. Das bedeutet, dass ich meinen Verstand nicht verliere. – picardo

+3

Nettes Zitat, aber Eich spricht hier über Ganzzahlen. Hier ist der Teil über Date, aus der gleichen Quelle: * "Ich hatte nur Hilfe für jsdate.c, von Ken Smith von Netscape (der, laut unserer überoptimistischen Vereinbarung, java.util.Date - Y2K Bugs und alle geklont hat ! Gosling ...) "* – user123444555621

6

Als Eric sagte, ist dies aufgrund Monate 0-11 Bereich aufgelistet werden .

Dies ist ein häufiges Verhalten - das gleiche gilt für Perl Ergebnisse von localtime() und wahrscheinlich viele andere Sprachen.

Dies ist wahrscheinlich ursprünglich von Unix localtime() Anruf geerbt. (do "man localtime")

Der Grund ist, dass Tage/Jahre ihre eigenen Ganzzahlen sind, während Monate (wie ein #) Indizes eines Arrays sind, die in den meisten Sprachen - insbesondere C, wo der zugrunde liegende Aufruf implementiert ist auf Unix - beginnt mit 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

Ich bin mir nicht sicher, welchen Punkt Sie hier machen, und der Code läuft nicht (' TypeError: function UTC() {[native code]} ist kein Konstruktor '). –

Verwandte Themen