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?


¿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.

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();

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);

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.


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.


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
);


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>


-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/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.