2012-02-29 10 views
5

Tengo dos cuadros de texto que aceptan Start Date y End Date respectivamente, en formato YYYY/MM/DD.Resta de fecha en JavaScript

Necesito alertar al usuario si selecciona una fecha de finalización que excede la fecha de inicio por 50 días.

Esto es lo que tengo hasta ahora:

var startDate = new Date(document.getElementsByName('MYSTARTDATE').value); 
var endDate = new Date(document.getElementsByName('MYENDDATE').value); 
if ((endDate - startDate) > 50) 
{ 
    alert('End date exceeds specification'); 
    return false; 
} 

A modo de ejemplo, cuando selecciono Fecha de Inicio como 2012/01/22 y fecha de finalización como 2012/02/29

startDate = 'Sun Jan 22 00:00:00 UTC +0530 2012' 
endDate = 'Wed Feb 29 00:00:00 UTC +0530 2012' 

Y el resultado de endDate - startDate es 3283200000, en lugar de 38. ¿Qué estoy haciendo mal?

Respuesta

9

3283200000 es de 38 días en milisegundos.

38 días x 24 horas x 60 minutos x 60 segundos x 1000 milisegundos

También, hay 38 días entre estas dos fechas, no 39.

Una solución fácil es tener una variable (constante en realidad) se define como el número de milisegundos en un día:

var days = 24*60*60*1000; 

y utilizar esa variable como una "unidad" en su comparación:

if ((endDate - startDate) > 50*days) { 
    ... 
} 
+0

oh..so supongo que solo necesito dividir la diferencia entre (24x60x60x1000) y luego. ¡Gracias! – user656523

+0

Sí, consulte mi edición para obtener una solución fácil y legible para el usuario. –

0

La solución de Jeff B es incorrecta debido al horario de verano. Si el fecha de inicio es, por ejemplo, el 31 de octubre y el día final es el 20 de diciembre, la cantidad de tiempo que realmente ha transcurrido entre esas dos veces es de 50 días más 1 hora, no 50 días. Esto es especialmente malo si a su programa no le importa la hora del día y establece todos los horarios a medianoche; en ese caso, todos los cálculos se desactivarán uno durante todo el invierno.

Parte de la forma correcta de restar fechas es instanciar un nuevo objeto Date para cada una de las veces, y luego usar una matriz con el número de días de cada mes para calcular cuántos días han pasado realmente.

Pero para empeorar las cosas, las fechas en que Europa cambia los relojes son diferentes a las fechas en que los relojes se cambian en Nueva York. Por lo tanto, la zona horaria por sí sola no es suficiente para determinar cuántos días han transcurrido; la ubicación también es necesaria.

El horario de verano agrega una complejidad significativa al manejo de la fecha. En mi sitio web, la función necesaria para calcular con precisión el número de días pasados ​​es de casi cien líneas. La complejidad real depende de si los cálculos son del lado del cliente o del servidor o de ambos y quién está viendo los datos.