Al inicializar un nuevo Date
objeto en JavaScript usando la siguiente llamada, descubrí que el argumento del mes cuenta a partir de cero.
new Date(2010, 3, 1); // that's the 1st April 2010!
¿Por qué el argumento del mes comienza desde 0? Por otro lado, el argumento del día del mes (el último) es un número del 1 al 31. ¿Hay buenas razones para esto?
javascript
datetime
date
Agnel Kurian
fuente
fuente
the Day of the week (integer)
0-6Respuestas:
Es una tradición antigua (probablemente desafortunada, probablemente agonizante) en el mundo de la programación, consulte la función C de localtime estándar antiguo (POSIX) http://linux.die.net/man/3/localtime
fuente
Date
objeto JS fue portado desde Java 1.0, por eso. Heredando todos sus defectos ... stackoverflow.com/questions/344380/…La verdadera respuesta a esta pregunta es que fue copiada
java.util.Date
, que también tenía esta peculiaridad. La prueba se puede encontrar en Twitter de Brendan Eich, el tipo que implementó originalmente JavaScript (incluido elDate
objeto):https://twitter.com/BrendanEich/status/481939099138654209
https://twitter.com/BrendanEich/status/771006397886533632
Esto sucedió en 1995 y JDK 1.0 estaba en beta. Se lanzó en 1996. En 1997, salió JDK 1.1, que desaprobó la gran mayoría de funciones
java.util.Date
, moviéndolas ajava.util.Calendar
, pero incluso eso todavía tenía meses de base cero. Los desarrolladores hartos de esto crearon la biblioteca Joda-Time , que finalmente dio lugar a unjava.time
paquete integrado en Java 8 (2014).En resumen, Java tardó 18 años en obtener una API de fecha / hora correctamente diseñada, pero JavaScript todavía está atrapado en la edad oscura. De hecho, tenemos excelentes bibliotecas como Moment.js , date-fns y js-joda . Pero a partir de ahora, no hay nada más
Date
integrado en el lenguaje. Con suerte, esto cambiará en un futuro próximo.fuente
Todo menos el día del mes se basa en 0, consulte aquí para obtener una lista completa que incluye rangos :)
En realidad, los días basados en 1 son los extraños aquí ... por extraño que parezca. ¿Por qué se hizo esto? No lo sé ... pero probablemente sucedió en la misma reunión en la que se enyesaron y decidieron que el punto y coma era opcional.
fuente
{ "first", "second", "third", ..., "twenty-seventh", ... }
) e intentaría indexarla portm_mday
. Por otra parte, tal vez solo vieron la absoluta utilidad de hacer que uno de los errores sea una ocurrencia regular.Siempre hay 12 meses en un año, por lo que las primeras implementaciones de C podrían haber usado una matriz estática de ancho fijo con índices 0..11.
fuente
Es así en Java también ... Probablemente para convertir int a string (0 - jan ,, 1-feb), codificaron de esta manera ... porque podrían tener una matriz de cadenas (indexadas desde 0) de nombres de meses y estos meses números si comienzan desde 0, será mucho más fácil asignarlos a las cadenas del mes.
fuente
Sé que en realidad no es una respuesta a la pregunta original, pero solo quería mostrarte mi solución preferida para este problema, que parece que nunca memorizo ya que aparece de vez en cuando.
La pequeña función zerofill hace el truco llenando los ceros donde sea necesario, y se acaba de
+1
agregar el mes :Pero sí, Date tiene una API bastante poco intuitiva, me estaba riendo cuando leí el Twitter de Brendan Eich.
fuente
Es posible que hayan considerado meses como una enumeración (el primer índice es 0) y días no, ya que no tienen un nombre asociado.
O más bien, pensaban que el número del día era la representación real del día (de la misma manera que los meses se representan como números en una fecha como el 31/12), como si pudiera hacer una enumeración con números como variables, pero en realidad Basado en 0.
Entonces, en realidad, durante los meses, tal vez pensaron que la representación de enumeración adecuada sería usar el nombre del mes, en lugar de números, y habrían hecho lo mismo si los días tuvieran una representación de nombre. Imagínese si dijéramos cinco de enero, seis de enero, en lugar de 5 de enero, 6 de enero, etc., entonces quizás también hubieran hecho una enumeración basada en 0 durante días ...
Quizás inconscientemente pensaron en una enumeración durante meses como {enero, febrero, ...} y durante días como {Uno, Dos, Tres, ...}, excepto los días en los que accedes al día como un número en lugar del nombre, como 1 por uno, etc., por lo que es imposible comenzar en 0 ...
fuente
Puede ser una falla, pero también es muy útil cuando desea representar los meses o el día de la semana como una cadena, puede crear una matriz como ['jan,' feb '... etc] [new Date () .getMonth ()] en lugar de ['', 'jan', feb ... etc] [new Date (). getMonth ()] o ['jan', 'feb' ... etc] [new Date ( ) .getMonth () - 1]
Los días del mes normalmente no tienen nombre, por lo que no creará matrices con nombres para ellos. En este caso, 1-31 es más fácil de manejar, por lo que debes restar 1 cada vez ...
fuente