2012-02-03 23 views
106

Tengo dos fechas de entrada que toman desde el control del selector de fecha. He seleccionado la fecha de inicio 2/2/2012 y la fecha de finalización el 2/7/2012. He escrito el siguiente código para eso.JavaScript: Cómo calcular el número de días entre dos fechas usando javascript

que debería obtener como resultado un 6 pero yo estoy recibiendo 5.

function SetDays(invoker) { 
    var start = $find('<%=StartWebDatePicker.ClientID%>').get_value(); 
    var end = $find('<%=EndWebDatePicker.ClientID%>').get_value(); 

    var oneDay=1000 * 60 * 60 * 24; 
    var difference_ms = Math.abs(end.getTime() - start.getTime()) 
    var diffValue = Math.round(difference_ms/oneDay); 
} 

¿Puede alguien decirme cómo puedo conseguir diferencia exacta?

+1

pero ... 7 menos 2 es 5 ... – Pointy

+0

¿por qué debería obtener resultado = 6? 07 - 02 = 05 días .... –

+0

Pero el rango de días de 2 a 7 es 2,3,4,5,6,7 = 6 días. – Supr

Respuesta

296

http://momentjs.com/ o https://date-fns.org/

a partir de documentos Momentos:

var a = moment([2007, 0, 29]); 
var b = moment([2007, 0, 28]); 
a.diff(b, 'days') // =1 

o para incluir el principio:

a.diff(b, 'days')+1 // =2 

Golpes Messi ng con marcas de tiempo y zonas horarias de forma manual.

Dependiendo de su caso de uso específico, puede

  1. Uso a/b.startOf('day') y/o a/b.endOf('day') para forzar el diff ser inclusivos o exclusivos a los "extremos" (como lo sugiere @kotpal en los comentarios) .
  2. Establezca el tercer argumento true para obtener un punto flotante diff que luego puede Math.floor, Math.ceil o Math.round según sea necesario.
  3. Opción 2 también se puede lograr obteniendo 'seconds' en lugar de 'days' y luego dividiendo entre 24*60*60.
+0

Gracias funcionó para mí. –

+12

moment.js dará un valor negativo si a

+4

Tenga en cuenta que ignore la parte de tiempo, de lo contrario obtendría resultados diferentes para la misma fecha pero con diferentes tiempos (como desde un control de selector de fecha). use moment (someDate) .startOf ('day') para establecer explícitamente la parte de tiempo a 00:00:00 antes de realizar un diff (o cualquier otra operación que sea sensible a la parte de tiempo del objeto Date/moment) – kotpal

8

Proveedores:

//Difference in days 

var diff = Math.floor((start - end)/86400000); 
alert(diff); 
+0

Creo que eso es básicamente correcto, pero ¿no es esencialmente lo mismo que lo que está en el PO? – Pointy

+0

Por la forma en que lo escribió, no me di cuenta, pero sí, ¡casi! : P – Richard

+0

Esto es más limpio y muy legible. –

Cuestiones relacionadas