2009-10-02 8 views
44

Yo estaba jugando con Javascript crear un simple reloj de cuenta atrás cuando me encontré con este comportamiento extraño:Javascript La función Date.UTC() está desactivada por un mes?

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

Los días que quedan fuera es por 30 días.

¿Qué hay de malo en este código?

Editar: Cambié los nombres de las variables para hacerlo más claro.

+0

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

Respuesta

85

El mes tiene cero base para JavaScript.

Los días y los años se basan en una sola unidad.

Vaya figura.

ACTUALIZACIÓN

La razón de que esto es así, desde el creator of JavaScript, es

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. Gracias. Eso significa que no estoy perdiendo la cabeza después de todo. – picardo

+3

Buena cita, pero Eich está hablando de enteros allí. Aquí está la parte sobre la fecha, de la misma fuente: * "Solo tuve ayuda para jsdate.c, de Ken Smith de Netscape (quien, según nuestro acuerdo demasiado optimista, clonó java.util.Date - errores Y2K y todo ! Gosling ...) "* – user123444555621

6

Como dijo Eric, esto se debe a meses de ser catalogado como 0-11 gama .

Esto es un comportamiento común: lo mismo se aplica a los resultados de Perl de localtime() y probablemente a muchos otros idiomas.

Esto es originalmente heredado de la llamada a localtime() de Unix. (do "man localtime")

La razón es que días/años son sus propios enteros, mientras que los meses (como #) son índices de una matriz, que en la mayoría de los lenguajes, especialmente C donde se implementa la llamada subyacente en Unix: comienza con 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

No estoy seguro de qué punto está haciendo aquí, y el código no se ejecuta (' TypeError: function UTC() {[native code]} no es un constructor '). –

Cuestiones relacionadas