¿Por qué Javascript trata los días y los meses de manera diferente?

42

Me di cuenta de que en JavaScript, al crear un Date, los meses son cero y los días no.

Por ejemplo:

var foo = new Date(2012, 1, 1)

produce el 1 de febrero de 2012

¿Por qué es esto?

surfitscrollit
fuente
66
months = ['Jan', 'Feb',..., 'Nov', 'Dec']; month = months[date.getMonth()];
zzzzBov

Respuestas:

50

Lo más probable es que la idea sea que los meses se consideren como un índice en una serie de nombres de meses, mientras que los días simplemente se "cuentan".

Thorsten Müller
fuente
21
Cuando esto tiene sentido desde el punto de vista de la respuesta, es una locura pensar que esta lógica ha existido durante tanto tiempo y nunca la he cuestionado antes.
rlemon
2
@rlemon El hecho de que nunca antes hayas cuestionado esa lógica solo prueba que tiene sentido :)
dasblinkenlight
14
FWIW, nunca pensé que tuviera mucho sentido. El procesamiento de fechas en JavaScript siempre fue algo que me hizo estremecer, porque generalmente olvidaba cosas como esta hasta que comencé a depurar resultados extraños.
FrustratedWithFormsDesigner
2
FWIW, no soy un desarrollador front-end y a menudo no tengo que lidiar con fechas en Javascript aparte de los ocasionalesnew Date().getTime()
rlemon
20
Cuando se trata de Javascript, "es por eso que lo hicieron" y "esto tiene sentido" son dos cosas que rara vez se escuchan juntas.
Tridus
14

También puede ser que las fechas de Javascript pretendan imitar las fechas de Java. Java también ha usado un mes basado en cero desde el principio.

API JDK v1.0.2: Date.getMonth ()

Danny Kirchmeier
fuente
66
Y la especificación de Java refleja la estructura C tm. Consulte también stackoverflow.com/questions/344380/…
35
Eso no quiere decir que la API de Java Date es un ejemplo terriblemente bueno de buen diseño ;-)
Joachim Sauer