Estoy tratando de convertir una cadena en un objeto Date, y funciona todos los días excepto el 31 de diciembre, donde el objeto dice 1 de diciembre en lugar de 31. No tengo ni idea de porqué. Aquí está mi JavaScript
código:
var dt = new Date();
dt.setDate("31");
dt.setMonth("11");
dt.setFullYear("2014");
pero mi valor de variable es:
Mon Dec 01 2014 11:48:08 GMT+0100 (Paris, Madrid)
Si hago lo mismo para cualquier otra fecha, mi objeto vuelve al valor apropiado. ¿Tienes idea de lo que hice mal?
javascript
date
datetime
usuario2859409
fuente
fuente
Date
parámetros del constructor directamente:new Date(2014, 11, 31)
Respuestas:
: ( no es seguro durante meses inferiores a 31 días )setMonth
debería antessetDate
var dt = new Date(); dt.setFullYear(2014); dt.setMonth(11); dt.setDate(31);
setMonth
El segundo parámetro de And también se puede utilizar para establecer la fecha.var dt = new Date(); dt.setFullYear(2014); dt.setMonth(11, 31);
Si no se proporcionan argumentos para el constructor, utilizará la fecha y hora actuales de acuerdo con la configuración del sistema.
Entonces, usar
setMonth
y porsetDate
separado aún causaría un resultado inesperado.Si los valores establecidos son mayores que su rango lógico , el valor se ajustará automáticamente al valor adyacente .
Por ejemplo, si hoy es
2014-09-30
, entoncesvar dt = new Date(); dt.setFullYear(2014); /* Sep 30 2014 */ dt.setMonth(1); /* Mar 02 2014, see, here the auto adjustment occurs! */ dt.setDate(28); /* Mar 28 2014 */
Para evitar esto, establezca los valores usando el constructor directamente.
var dt = new Date(2014, 11, 31);
fuente
setMonth
existía la forma de 2 argumentos .La cuestión es que, cuando estableces un día primero, todavía estás en el mes actual, es decir, septiembre. Septiembre tiene solo 30 días, así que:
var dt = new Date(); /* today */ dt.setDate("31"); /* 1st Oct 2014 as should be by spec */ dt.setMonth("11"); /* 1st Dec 2014 */ dt.setFullYear("2014"); /* 1st Dec 2014 */
fuente
Es porque lo primero que haces es
dt.setDate(31)
Esto establece la fecha actual en 31. El mes actual es septiembre, que tiene 30 días, por lo que lo está cerrando.
Si imprimiera la fecha después de este punto, diría 1 de octubre.
fuente
Suponiendo que su intención es establecer el año, el mes y la fecha simultáneamente, podría usar el constructor de fecha más larga :
Entonces escribirías:
var dt = new Date(2014, 11, 31);
Como ya se estableció, establecer una parte de la fecha a la vez puede provocar desbordamientos:
var dt = new Date(2012, 1, 29); // Feb 29 2012 dt.setFullYear(2014); // Mar 01 2014 instead of Feb 28 2014
Además, configurar el mes antes de la fecha aún puede causar un desbordamiento inesperado (las respuestas que recomiendan cambiar el orden de los métodos son incorrectas):
var dt = new Date(2014, 0, 31); // Jan 31 2014 dt.setFullYear(2014); // Jan 31 2014 dt.setMonth(1); // Mar 03 2014 instead of Feb 28 2014 dt.setDate(1); // Mar 01 2014
fuente
Se ha explicado ampliamente el por qué de la conducta y cómo evitarla.
Pero el verdadero error en su código es que no debe usar el constructor predeterminado: new Date (). Su código resultará en una fecha el 13 de diciembre con la hora actual. Dudo que esto sea lo que quieres. Debe usar el constructor de fecha que toma año, mes y día como parámetros.
fuente
Las respuestas dejaron en claro que el orden correcto para establecer la fecha es:
Solo quiero señalar que también es importante fijar el año en un principio, porque el 29 de febrero en años bisiestos.
fuente
var dt = new Date(); dt.setFullYear(2014); dt.setMonth(11); dt.setDate(31);
Pasa el valor como entero, no como cadena ... devolverá el valor correcto ...
Actualización : la descripción anterior no es correcta ... el problema principal era que necesitabas poner estas tres líneas en la secuencia adecuada ... Incluso después de corregir la secuencia, olvidé corregir la descripción ...: P
fuente