Cómo calcular el número de días entre dos fechas

283

Tengo dos fechas de entrada que toman del control Selector de fecha. Seleccioné la fecha de inicio del 2/2/2012 y la fecha de finalización del 2/7/2012. He escrito el siguiente código para eso.

Debería obtener el resultado como 6 pero obtengo 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);
}

¿Alguien puede decirme cómo puedo obtener la diferencia exacta?

Vaibhav Deshmukh
fuente
¿Por qué debería obtener resultado = 6 ??? 07 - 02 = 05 días ....
André Alçada Padez
1
Pero el rango de días de 2 a 7 es 2,3,4,5,6,7 = 6 días.
Supr
Mientras tomo la diferencia, quiero considerar la fecha de inicio también ...
Vaibhav Deshmukh
17
Bueno ... ¿por qué no simplemente agregar 1 a la respuesta?
Puntiagudo
El problema (si hay algún problema) es funcional, no técnico. El comentario de @Pointy es la respuesta. Es por eso que algunas personas preguntan por qué estamos en el siglo XXI.
Leandro

Respuestas:

667

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

De los documentos de Moment:

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

o para incluir el inicio:

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

Es mejor que jugar con marcas de tiempo y zonas horarias manualmente.

Dependiendo de su caso de uso específico, puede

  1. Use a/b.startOf('day')y / o a/b.endOf('day')para forzar que el diff sea inclusivo o exclusivo en los "extremos" (como lo sugiere @kotpal en los comentarios).
  2. Establezca el tercer argumento truepara obtener una diferencia de punto flotante que pueda Math.floor, Math.ceilo Math.roundsegún sea necesario.
  3. La opción 2 también se puede lograr obteniendo en 'seconds'lugar de 'days'y luego dividiendo entre 24*60*60.
Supr
fuente
30
moment.js dará un valor negativo si a <b. Entonces, un cálculo más robusto sería: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni
18
Tenga en cuenta que debe ignorar la parte de tiempo; de lo contrario, obtendría resultados diferentes para la misma fecha pero con horas diferentes (como el control de un selector de fechas). 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
Esto funciona pero no tiene en cuenta el componente de tiempo. Intentando diferenciar entre los dos pares siguientes: (a = "2017-12-24T00: 00: 00Z" y "b = 2017-12-31T23: 59: 59Z") y (a = "2017-12-24T23: 00 : 00Z "yb =" 2017-12-31T23: 59: 59Z "). return b.diff (a, 'días') <= 7; ambos vuelven verdad. ¿Hay alguna manera de incluir el componente de tiempo en la diferencia?
Roobie
1
+1 para startOf () y endOf (). He usado esta biblioteca durante algunos años y nunca antes me había dado cuenta. Siempre hice +1.
Mike Devenney
3
Tenga en cuenta que startOfmuta el momento. Si no quieres eso, entonces hazlo a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ
53

Si está utilizando moment.js , puede hacerlo fácilmente.

var start = moment("2018-03-10", "YYYY-MM-DD");
var end = moment("2018-03-15", "YYYY-MM-DD");

//Difference in number of days
moment.duration(start.diff(end)).asDays();

//Difference in number of weeks
moment.duration(start.diff(end)).asWeeks();

Si desea encontrar la diferencia entre una fecha dada y la fecha actual en número de días (ignorando la hora), asegúrese de eliminar la hora del momento objeto de la fecha actual como se muestra a continuación

moment().startOf('day')

Para encontrar la diferencia entre una fecha dada y una fecha actual en número de días

var given = moment("2018-03-10", "YYYY-MM-DD");
var current = moment().startOf('day');

//Difference in number of days
moment.duration(given.diff(current)).asDays();
Rakesh Prajapati
fuente
2
asDays () me devolvió algunos valores con decimales. Yo uso current.diff(given, 'days')para que se redondea.
Vincent
@ Vincent parece que estás usando esto de manera incorrecta. esta es definitivamente la solución más limpia, el resultado es correcto en comparación con la respuesta de @Supr en la que 1se pierde un
Nwawel A Iroume
15

Tratar:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);
Ricardo
fuente
Creo que eso es básicamente correcto, pero ¿no es esencialmente lo mismo que lo que está en el OP?
Puntiagudo
Debido a la forma en que lo escribió, no me di cuenta, pero sí, ¡más o menos! : P
Richard
55
No me gustan los números mágicos ... sería mejor si ese número se desglosara en una ecuación autoexplicativa
vsync
7

Pruebe esto usando moment.js (es bastante fácil calcular las operaciones de fecha en javascript)

firstDate.diff (secondDate, 'days', false); // verdadero | falso para el valor de fracción

El resultado le dará el número de días en entero.

Sumit
fuente
aquí está la firma: moment (). diff (Moment | String | Number | Date | Array, String, Boolean);
Sumit
1

También puede usar este código: moment ("yourDateHere", "YYYY-MM-DD"). FromNow (). Esto calculará la diferencia entre hoy y su fecha provista.

David
fuente
1

Esto funciona para mi:

const from = '2019-01-01';
const to   = '2019-01-08';

Math.abs(
    moment(from, 'YYYY-MM-DD')
      .startOf('day')
      .diff(moment(to, 'YYYY-MM-DD').startOf('day'), 'days')
  ) + 1
);

Martin Kravec
fuente
1

Hice una función reutilizable rápida en ES6 usando Moment.js.

const getDaysDiff = (start_date, end_date, date_format = 'YYYY-MM-DD') => {
  const getDateAsArray = (date) => {
    return moment(date.split(/\D+/), date_format);
  }
  return getDateAsArray(end_date).diff(getDateAsArray(start_date), 'days') + 1;
}

console.log(getDaysDiff('2019-10-01', '2019-10-30'));
console.log(getDaysDiff('2019/10/01', '2019/10/30'));
console.log(getDaysDiff('2019.10-01', '2019.10 30'));
console.log(getDaysDiff('2019 10 01', '2019 10 30'));
console.log(getDaysDiff('+++++2019!!/###10/$$01', '2019-10-30'));
console.log(getDaysDiff('2019-10-01-2019', '2019-10-30'));
console.log(getDaysDiff('10-01-2019', '10-30-2019', 'MM-DD-YYYY'));

console.log(getDaysDiff('10-01-2019', '10-30-2019'));
console.log(getDaysDiff('10-01-2019', '2019-10-30', 'MM-DD-YYYY'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>

Philippe Makzoume
fuente
-1

MVC tengo dos entradas de texto 1: número del día 2: selector de fecha y hora

 @Html.TextBox("HeaderINVID", null, new { @id = "HeaderINVID", @type = "number", @class = "form-control", autocomplete = "off", placeholder = "Day Count " })

  @Html.TextBox("HeaderINVDT", null, new { id = "HeaderINVDT", @class = "form-control format-picker", autocomplete = "off", placeholder = " Date" })

javascipt

para calcular el número a partir de la fecha de uso

    $("#HeaderINVID").bind("keyup", function (e) {
        var INVID = $("#HeaderINVID").val();
        var date = moment()
            .add(INVID, 'd')
            .toDate(); 
        $("#HeaderINVDT").val(moment(date).format('YYYY-MM-DD')) ;
    })

para calcular el número de días entre dos fechas use

  $("#HeaderINVDT").bind('change', function (e) {
        var StDT = moment($("#HeaderINVDT").val()).startOf('day');
        var NODT = moment().startOf('day');
        $("#HeaderINVID").val(StDT.diff(NODT, 'days'));
    })

no olvides agregar http://momentjs.com/

Aladein
fuente