2010-11-05 9 views
7

Tengo una sección de Javascript simple en mi aplicación que tiene un enlace "Agregar día", que agrega 1 día a una fecha. Siempre funciona perfectamente, excepto cuando la fecha llega a ser el 11/07/2010, y luego el enlace de repente ya no funciona. Es realmente extraño, porque solo cuelga en la fecha específica del 07/11/2010.Fecha de Javascript, ¿es este mi error o encontré un error?

cómo reproducir el error:

  1. Vaya a la página here
  2. En cualquier campo de fecha, haga clic en "Hoy", o simplemente establecer la fecha de hoy.
  3. Haga clic en "Agregar día" hasta llegar a 11/07/2010
  4. ¡Ahora al hacer clic en "Agregar día" ya no funciona!
+0

para mí en Chrome. Parece que funciona bien. – harpo

+1

Funciona para mí (FF 3.6.12). ¿Qué navegador? –

+0

Funciona para mí. ¿Qué navegador estás usando? ¿Podría ser mordido por un error de cálculo del horario de verano? –

Respuesta

13

El problema es que está agregando las 24 horas a la fecha para agregar un día; El horario de verano ha frustrado porque 24 horas después de las 00:00 el 7 de noviembre será a las 23:00 (por segunda vez) el 7 de noviembre.

+0

Y, por supuesto, este comportamiento dependerá de si el horario de verano termina el 7 de noviembre en la localidad donde se está ejecutando su navegador. –

+1

Buena captura. Estoy en AZ - no tenemos DST aquí :) –

+0

+1 porque escribo lento: \ – Angiosperm

1

Horario de verano. (En la mayoría de los lugares en los EE. UU.) El tiempo retrocede el primer domingo de noviembre. Su código solo agrega una cantidad de milisegundos al inicio del día especificado por el cuadro de entrada, y devuelve el comienzo del día resultante: sin embargo, debido al horario de verano, simplemente agregando segundos y truncando la fecha de esta manera, nunca avanzará la fecha .

3

Otros detectaron cuál es el problema.

Para solucionarlo se puede utilizar la sobrecarga Date constructor que toma el año, mes y día:

var aDate = new Date(2010, 10, 07); 
var aDatePlusOneDay = new Date(aDate.getFullYear(), 
           aDate.getMonth(), 
           aDate.getDate() + 1, // HERE 
           aDate.getHours(), 
           aDate.getMinutes(), 
           aDate.getSeconds(), 
           aDate.getMilliseconds()); 

Aquí hay una solución más genérica que puede incrementar cualquier fecha por una cantidad de milisegundos dado, teniendo cambios en los cambios de horario en cuenta:

Date.addTicks = function(date, ticks) { 
    var newDate = new Date(date.getTime() + ticks); 
    var tzOffsetDelta = newDate.getTimezoneOffset() - date.getTimezoneOffset(); 
    return new Date(newDate.getTime() + tzOffsetDelta * 60000); 
} 

adición de un día a un objeto Date entonces es una cuestión de añadir el número de milisegundos en un día:

Date.addTicks(new Date(2010, 10, 7), 86400000); // new Date(2010, 10, 8) 

Referencias:

No
Cuestiones relacionadas