2008-10-30 18 views
11

Estoy en Javascript, la ejecución de este en la consolaEl quince de febrero no se encuentra

d = new Date();    
d.setMonth(1); 
d.setFullYear(2009); 
d.setDate(15);         
d.toString(); 

Muestra esto:

"Sun Mar 15 2009 18:05:46 GMT-0400 (EDT)" 

¿Por qué estar pasando esto? Parece un error del navegador.

+2

Tenga cuidado con los ides de marzo. – eyelidlessness

Respuesta

30

Eso es porque cuando inicializas una nueva Fecha, viene con la fecha de hoy, entonces hoy es 30 de octubre de 2008, luego estableces el mes en febrero, entonces no hay 30 de febrero, entonces establece primero el día, luego el mes y luego el año:

d = new Date(); 
d.setDate(15);      
d.setMonth(1); 
d.setFullYear(2009); 

Pero como @Jason W, dice que es mejor usar la Fecha constructor:

new Date(year, month, date [, hour, minute, second, millisecond ]); 
+0

¿Qué sucede si actualmente es febrero y llama a d.setDate (30)? –

+0

Todo está bien, siempre y cuando sea un año bisiesto doble. –

+0

Si el año no es un salto, entonces febrero tiene 28 días, debería darle el 2 de marzo, si el año es un salto, 01 de marzo – CMS

1
d = new Date(); 
d.setDate(15);      
d.setMonth(1); 
d.setFullYear(2009);                 
d.toString(); 

Esto funciona.

+1

En su pregunta original, establecer el mes primero causaba un problema porque hoy es el 30 y el 30 de febrero no existe, por lo que Javascript ajustó la fecha para usted.Piénselo, si hubiera escrito este código hace un par de días, probablemente hubiera funcionado bien. ¡Suerte que trabajaste en eso hoy! – BoltBait

+0

por qué no hacerlo en un solo paso como Jason W mencionó. –

+0

Hacerlo en un solo paso es lo que terminé haciendo, acabo de publicar esto tan pronto como descubrí cuál era el problema. –

27

es probablemente el mejor para construir un objeto Date en un solo paso para evitar el objeto Date siendo en un estado ambiguo o no válido:

d = new Date(2009, 1, 15); 
0

Después de un montón de pruebas en FF3 en XP con Firebug, aquí son las cosas que puedo decir

  • Calling Date.setDate() después de llamada Date.setMonth() generará este extraño comportamiento.
  • Date.setMonth() fuerza a la zona horaria de ser CST (o, algunos zona no DST-consciente)
  • Date.setDate() fuerza a la zona horaria de ser CDT (o, alguna zona DST-consciente)

Por lo tanto, definitivamente hay algo raro con setMonth() y setDate() con respecto a la zona horaria.

La única solución que puedo ofrecer es la siguiente: Establezca la fecha antes de configurar el mes.

+0

No. Si configura la fecha antes del mes, no ayuda cuando el objeto de fecha actual es, p. Ej. "2012-04-15" y desea ir a "2012-03-31", ya que establecer la fecha en 31 con abril lo moverá al 1 de mayo, antes de configurar el mes en marzo, que termina en "2012-03 -01 ". Primero debe llamar a setDate (1), luego año, mes y fecha. –

0

Esto funciona en general para evitar la rollover behavior de la API de JavaScript Fecha:

d.setDate(1); 
d.setFullYear(year); 
d.setMonth(month); 
d.setDate(day); 

Teniendo en cuenta que el año + mes + día están en una combinación "válido", por ejemplo, tomado de otro objeto Date utilizando getFullYear(), getMonth(), getDate().

Las partes importantes son:

  • comenzando con setDate(1) para evitar un posible vuelco cuando el valor de la fecha actual es 29, 30 o 31
  • llamada setMonth(month) antes setDate(day) para evitar el mismo vuelco en caso de que el mes en curso el valor es "problemático" (porque entonces el setDate(1) inicial sería sin efecto)
Cuestiones relacionadas