2009-08-18 13 views
7

Estoy buscando una forma de hacer una resta adecuada entre dos objetos de Fecha de javascript y obtener el delta del día.javascript date resta

Este es mi enfoque, pero falla por la fecha de hoy como entrada:

<script type="text/javascript"> 
function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth,incomingDay); 
var today = new Date(); 

var delta = incomingDate - today; 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 

//fails for the today as input, as expected 0 delta,instead gives 31: 
alert(getDayDelta(2009,8,18)); 
</script> 

lo que sería un mejor enfoque para esto?

Respuesta

7

El número del mes en la función Fecha constructor se basa cero, se debe restar uno, y yo creo que es más simple para calcular el delta usando la marca de tiempo:

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
    var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay), 
     today = new Date(), delta; 
    // EDIT: Set time portion of date to 0:00:00.000 
    // to match time portion of 'incomingDate' 
    today.setHours(0); 
    today.setMinutes(0); 
    today.setSeconds(0); 
    today.setMilliseconds(0); 

    // Remove the time offset of the current date 
    today.setHours(0); 
    today.setMinutes(0); 

    delta = incomingDate - today; 

    return Math.round(delta/1000/60/60/ 24); 
} 


getDayDelta(2008,8,18); // -365 
getDayDelta(2009,8,18); // 0 
getDayDelta(2009,9,18); // 31 
+0

gracias por la corrección, pero esto parece fallar en: getDayDelta (2009,8,19); // debería devolver 1 pero devuelve 0 (es 18 en mi tiempo local) – Hellnar

+0

Sí, eso es porque 'today' incluye la hora, ver mi edición ... – CMS

+0

@Crib: El problema es que' incomingDate' tiene una porción de tiempo de 0 horas, 0 minutos, 0 segundos y 0 milisegundos. Tienes que hacer lo mismo para "hoy" o obtendrás días parciales para un día adelante/atrás. He editado la respuesta para reflejar el cambio. –

5

Puede llamar a getTime() en cada objeto de fecha, luego restar el último de los anteriores. Esto le daría la cantidad de milisegundos de diferencia entre los dos objetos. A partir de ahí, es fácil llegar a los días.

Sin embargo, hay un par de inconvenientes a tener en cuenta: 1) el horario de verano y 2) asegurarse de que sus tiempos provengan de la misma zona horaria.

6

(2009,8,18) NO ES 18 de agosto. Es el 18 de septiembre.

+3

Los meses son un índice basado en cero. 0 es enero. – Sampson

+0

Esto es correcto ya que la función de fecha cero indexa meses. – MacAnthony

+1

oh javascript, ¡qué gracioso! – Rebs

0

Esto funcionará mejor, pero doesn Tratar adecuadamente los valores de resultado negativos. Es posible que desee simplemente analizar los valores usted mismo y tratar con ellos.

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay); 
var today = new Date(); 
today = new Date(Date.parse(today.format("yyyy/MM/dd"))); 

var delta = incomingDate - today; 
if (delta == 0) { return 0; } 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 
alert(getDayDelta(2009, 8, 18)); 
+0

no es una función http://is.gd/2n46k – CMS

+0

Entonces, ¿por qué funciona? (Mi entorno es ASP.NET.) –

+1

Sí, ASP .NET Ajax Framework amplía el objeto Date del lado del cliente – CMS