Come calcolare il numero di giorni tra due date


283

Ho due date di input che prendono dal controllo Selezione data. Ho selezionato la data di inizio 2/2/2012 e la data di fine 07/02/2012. Ho scritto il seguente codice per quello.

Dovrei ottenere il risultato come 6 ma sto ottenendo 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);
}

Qualcuno può dirmi come posso ottenere la differenza esatta?


perché dovresti ottenere il risultato = 6 ??? 07 - 02 = 05 giorni ....
André Alçada Padez,

1
Ma l'intervallo di giorni da 2 a 7 è di 2,3,4,5,6,7 = 6 giorni.
Supr

Mentre faccio la differenza, voglio considerare anche la data di inizio ....
Vaibhav Deshmukh,

17
Bene ... perché non aggiungere solo 1 alla risposta?
Punta

Il problema (se esiste un problema) è funzionale, non tecnico. Il commento @Pointy è la risposta. Ecco perché alcune persone chiedono perché siamo nel XXI secolo.
Leandro,

Risposte:


667

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

Dai documenti Moment:

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

o per includere l'inizio:

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

Batte i messaggi con timestamp e fusi orari manualmente.

A seconda del caso d'uso specifico, è possibile

  1. Usa a/b.startOf('day')e / o a/b.endOf('day')per forzare il diff ad essere inclusivo o esclusivo alle "estremità" (come suggerito da @kotpal nei commenti).
  2. Imposta il terzo argomento trueper ottenere un diff in virgola mobile che puoi quindi Math.floor, Math.ceilo Math.roundsecondo necessità.
  3. L'opzione 2 può anche essere realizzata ottenendo 'seconds'anziché 'days'dividendo 24*60*60.

30
moment.js darà un valore negativo se a <b. Quindi, un calcolo più solido sarebbe: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni,

18
Fai attenzione a ignorare la parte temporale, altrimenti otterrai risultati diversi per la stessa data ma con orari diversi (come da un controllo selezione data). usa moment (someDate) .startOf ('day') per impostare esplicitamente la parte temporale su 00:00:00 prima di eseguire un diff (o qualsiasi altra operazione sensibile alla parte temporale dell'oggetto Date / moment)
kotpal

Funziona ma non tiene conto del componente time. Tentativo di diff tra le seguenti due coppie: (a = "2017-12-24T00: 00: 00Z" e "b = 2017-12-31T23: 59: 59Z") e (a = "2017-12-24T23: 00 : 00Z "e b =" 2017-12-31T23: 59: 59Z "). return b.diff (a, 'days') <= 7; entrambi ritornano veri. C'è un modo per includere la componente temporale nel diff?
Roobie,

1
+1 per startOf () e endOf (). Ho usato questa biblioteca per alcuni anni e non li avevo mai notato prima. Ho sempre fatto +1.
Mike Devenney,

3
Sii consapevole che startOfmuta il momento. Se non lo vuoi, allora fallo a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ

53

Se stai usando moment.js puoi farlo facilmente.

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

Se si desidera trovare la differenza tra una determinata data e la data corrente nel numero di giorni (ignorando l'ora), assicurarsi di rimuovere l'ora dall'oggetto momento della data corrente come di seguito

moment().startOf('day')

Per trovare la differenza tra una determinata data e la data corrente in numero di giorni

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 () mi ha restituito alcuni valori con i decimali. Lo uso in current.diff(given, 'days')modo che arrotonda.
Vincent,

@Vincent sembra che tu lo stia usando nel modo sbagliato. questa è definitivamente la soluzione più pulita il risultato è giusto rispetto alla risposta di @Supr in cui 1si perde un
Nwawel A Iroume

15

Provare:

//Difference in days

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

Penso che sia fondamentalmente giusto ma non è sostanzialmente lo stesso di quello che c'è nell'OP?
Punta

A causa del modo in cui l'ha scritto non me ne sono accorto, ma sì, praticamente! : P
Richard,

5
Non mi piacciono i numeri magici .. sarebbe meglio se quel numero fosse scomposto in un'equazione autoesplicativa
vsync,

7

Prova questo usando moment.js (è abbastanza facile calcolare le operazioni di data in javascript)

firstDate.diff (secondDate, 'days', false); // true | false per il valore della frazione

Il risultato ti darà il numero di giorni in numero intero.


ecco la firma: moment (). diff (Moment | String | Number | Date | Array, String, Boolean);
Vertice

1

Inoltre puoi usare questo codice: moment ("yourDateHere", "YYYY-MM-DD"). FromNow (). Questo calcolerà la differenza tra oggi e la data fornita.


1

Questo funziona per me:

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

Ho realizzato una rapida funzione riutilizzabile in ES6 utilizzando 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 ho due testo di input 1: numero del giorno 2: selettore datetime

 @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

per calcolare il numero dalla data di utilizzo

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

per calcolare il numero di giorni tra due date utilizzare

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

non dimenticare di aggiungere http://momentjs.com/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.