2012-03-13 9 views
13

Esto me causó un poco de dolor de cabeza anoche y quería entender por qué el método getDate en el objeto Date está basado en 1 (devuelve valores de 1 a 31) mientras que el método getMonth es 0 basado (devuelve 0-11). Me pregunto por qué hay esta inconsistencia en los métodos para el mismo objeto.Javascript Integridad del método de fecha - getDate vs getMonth

Entiendo por qué es difícil cambiar el comportamiento ahora, pero ¿hay alguna razón para que esto haya sido diseñado así en primer lugar?

documentación se puede encontrar aquí: http://www.w3schools.com/jsref/jsref_obj_date.asp

+1

relacionadas: http://stackoverflow.com/questions/834757/why-does-getday-return-incorrect-values-javascript/834807#834807 – Guffa

+0

dejarlo caer un tweet y preguntarle, Me encantaría escuchar su respuesta, ¡también me sorprendió! http://twitter.com/#!/brendaneich (ps cuando digo 'él' me refiero al creador) – Magrangs

+0

rel: http://stackoverflow.com/questions/1453043/zero-based-month-numbering – georg

Respuesta

14

supongo meses están basados ​​en 0 porque Java did it the same way cuando se diseñó el lenguaje JavaScript.

EDITAR Oracle llevó documentación de Java mayores, hay an archived version of that page.

+1

Supongo que mi pregunta se convierte en por qué se implementó de esa manera en Java? –

+0

@DanGoldin: estaba anticipando esa respuesta. Y solo pude adivinar: porque decidieron que sería confuso devolver '12' de' getDate() 'cuando la fecha actual es' 13'. Y también decidieron que 'para (m = 0; m <12; m ++)' se vería mejor que 'for (m = 1; m <13; m ++)'. O algo así. – Tomalak

+4

@Tomalak: parece que estás en lo correcto en función de la respuesta de Brendan Eich - https://twitter.com/#!/BrendanEich/status/179638412775661572 –

4

En JavaScript, contadores comienzan en cero.

Los meses no necesariamente tienen que estar representados por un dígito. "Meses" es una secuencia contable. El primer elemento de esta secuencia se refiere por cero.

En la vida real, los días están representados por un dígito fijo. Aunque los días también son contables, sería extremadamente confuso representar el primer día como Día Cero.

+2

* "Los meses no necesariamente tienen que comenzar en 1" * - Esa es una afirmación que encuentro difícil de entender. – Tomalak

+0

@Tomalak Con eso, quiero decir que los meses pueden representarse por "Enero", etc. No se me ocurre ningún otro método para representar los días del mes. Los días de una semana, por otro lado, también se pueden representar con "Domingo", etc. También comienza a contar a cero. –

+0

Pero en la vida real, los meses están representados por un dígito fijo también. –

6

Es difícil de decir, pero tengo la sospecha de que Mes está basado en 0 para que pueda ser fácilmente utilizado como un indexador en una matriz meses que mantiene nombres de los meses

var months = new ["Jan", "Feb", ....] 
months[new Date().getMonth()]; 
+1

Esta es una explicación bastante interesante, ¡gracias! Todavía considero que es un mal diseño implementarlo para que esté basado en 0 porque sospecha que las personas querrían asignarlo a una matriz. Creo que sería mejor mantenerlo en 1 y luego hacer que los usuarios decidan restar 1 si quieren indexarlos en la matriz. –

+0

No digo que sea un buen diseño, solo creo que * puede * haber sido el motivo. –

+1

¡Las fechas también pueden! 'var dates = [1,2,3 ... 31]' – jjt

21

Así que cayó Brendan Eich un tweet le hace la pregunta (para aquellos que no saben que es el creador de JS) y su respuesta fue:

@magrangs porque así es como java.util .Fue bien hecho.

https://twitter.com/BrendanEich/status/179610205317902337

+3

Ok, nueva pregunta: ¿por qué Java lo hizo de esa manera? ("¡Porque así es como C lo hizo!" ... Bien, ¿por qué C lo hizo de esa manera? ... ???) – Noyo

+1

@Noyo Porque usar un recuento basado en cero hace posible indexar en una matriz. http://stackoverflow.com/questions/9687521/9687586#9687586 – Tomalak

Cuestiones relacionadas