So berechnen Sie die Anzahl der Tage zwischen zwei Daten

282

Ich habe zwei Eingabedaten aus der Datumsauswahlsteuerung. Ich habe das Startdatum 2/2/2012 und das Enddatum 2/7/2012 ausgewählt. Ich habe folgenden Code dafür geschrieben.

Ich sollte das Ergebnis 6 bekommen, aber ich bekomme 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);
}

Kann mir jemand sagen, wie ich einen genauen Unterschied erzielen kann?

Vaibhav Deshmukh
quelle
warum solltest du result = 6 bekommen ??? 07 - 02 = 05 Tage ....
André Alçada Padez
1
Der Bereich der Tage von 2 bis 7 beträgt jedoch 2,3,4,5,6,7 = 6 Tage.
Supr
Während ich den Unterschied nehme, möchte ich auch das
Startdatum
17
Nun ... warum nicht einfach 1 zur Antwort hinzufügen?
Pointy
Das Problem (wenn es überhaupt ein Problem gibt) ist funktional und nicht technisch. @Pointy Kommentar ist die Antwort. Deshalb fragen einige Leute, warum wir im 21. Jahrhundert sind.
Leandro

Antworten:

666

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

Von Moment docs:

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

oder um den Start einzuschließen:

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

Beats das manuelle Durchspielen von Zeitstempeln und Zeitzonen.

Abhängig von Ihrem spezifischen Anwendungsfall können Sie entweder

  1. Verwenden a/b.startOf('day')und / oder a/b.endOf('day')erzwingen Sie, dass der Diff an den "Enden" inklusiv oder exklusiv ist (wie von @kotpal in den Kommentaren vorgeschlagen).
  2. Set drittes Argument trueein Gleitkomma - diff zu erhalten , die Sie dann Math.floor, Math.ceiloder je Math.roundnach Bedarf.
  3. Option 2 kann auch erreicht werden, indem 'seconds'anstelle von 'days'und dann durch dividiert wird 24*60*60.
Supr
quelle
30
moment.js gibt einen negativen Wert, wenn a <b. Eine robustere Berechnung wäre also: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni
18
Beachten Sie den Zeitteil. Andernfalls erhalten Sie unterschiedliche Ergebnisse für dasselbe Datum, jedoch mit unterschiedlichen Zeiten (z. B. bei einer Datumsauswahl). Verwenden Sie moment (someDate) .startOf ('day'), um den Zeitteil explizit auf 00:00:00 zu setzen, bevor Sie ein Diff ausführen (oder andere Operationen, die für den
Zeitteil
Dies funktioniert, berücksichtigt jedoch nicht die Zeitkomponente. Es wird versucht, zwischen den folgenden zwei Paaren zu unterscheiden: (a = "2017-12-24T00: 00: 00Z" und "b = 2017-12-31T23: 59: 59Z") und (a = "2017-12-24T23: 00" : 00Z und b = 2017-12-31T23: 59: 59Z). return b.diff (a, 'Tage') <= 7; beide geben true zurück. Gibt es eine Möglichkeit, die Zeitkomponente in das Diff aufzunehmen?
Roobie
1
+1 für startOf () und endOf (). Ich habe diese Bibliothek einige Jahre lang benutzt und sie noch nie bemerkt. Ich habe immer +1 gemacht.
Mike Devenney
3
Seien Sie sich bewusst, dass startOfder Moment mutiert. Wenn Sie das nicht wollen, dann tun Sie es a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ
53

Wenn Sie moment.js verwenden , können Sie dies problemlos tun.

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

Wenn Sie einen Unterschied zwischen einem bestimmten Datum und dem aktuellen Datum in der Anzahl der Tage feststellen möchten (ohne Berücksichtigung der Uhrzeit), müssen Sie die Uhrzeit wie folgt aus dem Momentobjekt des aktuellen Datums entfernen

moment().startOf('day')

Ermittlung des Unterschieds zwischen einem bestimmten Datum und dem aktuellen Datum in Anzahl der Tage

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
quelle
2
asDays () hat mir einige Werte mit Dezimalstellen zurückgegeben. Ich benutze current.diff(given, 'days')es also rundet es ab.
Vincent
@ Vincent es scheint, dass Sie dies falsch verwenden. Dies ist definitiv die sauberere Lösung, die das Ergebnis im Vergleich zu der Antwort von @Supr, in der a 1verloren
geht, richtig
15

Versuchen:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);
Richard
quelle
Ich denke, das ist im Grunde richtig, aber ist es nicht im Wesentlichen dasselbe wie das, was im OP steht?
Pointy
Wegen der Art, wie er es schrieb, habe ich es nicht bemerkt, aber ja, ziemlich genau! : P
Richard
5
Ich mag keine magischen Zahlen . Es wäre besser, wenn diese Zahl in eine selbsterklärende Gleichung
zerlegt würde
7

Versuchen Sie dies mit moment.js (es ist ziemlich einfach, Datumsoperationen in Javascript zu berechnen)

firstDate.diff (secondDate, 'days', false); // true | false für Bruchwert

Das Ergebnis gibt Ihnen die Anzahl der Tage in Ganzzahl.

Sumit
quelle
Hier ist die Signatur: moment (). diff (Moment | String | Number | Date | Array, String, Boolean);
Summe
1

Sie können auch diesen Code verwenden: moment ("yourDateHere", "YYYY-MM-DD"). FromNow (). Dadurch wird die Differenz zwischen dem heutigen Tag und Ihrem angegebenen Datum berechnet.

David
quelle
1

Das funktioniert bei mir:

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
quelle
1

Ich habe mit ES.s eine schnell wiederverwendbare Funktion in ES6 erstellt.

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
quelle
-1

MVC Ich habe zwei Eingabetexte 1: Anzahl der Tage 2: Datums- / Uhrzeitauswahl

 @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

um die Anzahl aus dem Datumsgebrauch zu berechnen

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

Um die Anzahl der Tage zwischen zwei Daten zu berechnen, verwenden Sie

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

Vergessen Sie nicht, http://momentjs.com/ hinzuzufügen.

Aladein
quelle