Wie erhalte ich die Anzahl der Tage zwischen zwei Daten in JavaScript? Beispiel: Geben Sie zwei Daten in Eingabefeldern an:
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script>
javascript
date
Michael Haren
quelle
quelle
Antworten:
Hier ist eine schnelle und schmutzige Implementierung von
datediff
, als Proof of Concept, um das in der Frage dargestellte Problem zu lösen. Es beruht auf der Tatsache, dass Sie die verstrichenen Millisekunden zwischen zwei Daten erhalten können, indem Sie sie subtrahieren, wodurch sie in ihren primitiven Zahlenwert (Millisekunden seit Anfang 1970) gezwungen werden.Sie sollten sich bewusst sein, dass die "normalen" Datums-APIs (ohne "UTC" im Namen) in der lokalen Zeitzone des Browsers des Benutzers ausgeführt werden. Daher können im Allgemeinen Probleme auftreten, wenn sich Ihr Benutzer in einer Zeitzone befindet, die Sie nicht kennen Erwarten Sie, und Ihr Code muss sich mit Übergängen der Sommerzeit befassen. Sie sollten die Dokumentation für das Date-Objekt und seine Methoden sorgfältig lesen und für kompliziertere Zwecke die Verwendung einer Bibliothek in Betracht ziehen, die sicherere und leistungsfähigere APIs für die Datumsmanipulation bietet.
Date
- MDN-JavaScript-ReferenzZur Veranschaulichung verwendet das Snippet der
window
Kürze halber einen benannten Zugriff auf das Objekt. In der Produktion sollten Sie jedoch standardisierte APIs wie getElementById oder wahrscheinlicher ein UI-Framework verwenden.quelle
parseDate
Methode wiereturn new Date(mdy[2], mdy[1], mdy[0]-1);
Zum jetzigen Zeitpunkt behandelt nur eine der anderen Antworten die DST-Übergänge (Sommerzeit) korrekt. Hier sind die Ergebnisse eines Systems in Kalifornien:
Obwohl
Math.round
die korrekten Ergebnisse zurückgegeben werden, finde ich es etwas klobig. Stattdessen können wir die exakte Arithmetik verwenden, indem wir Änderungen am UTC-Offset explizit berücksichtigen, wenn die Sommerzeit beginnt oder endet:Erläuterung
JavaScript-Datumsberechnungen sind schwierig, da
Date
Objekte Zeiten intern in UTC und nicht in Ortszeit speichern. Beispielsweise wird die pazifische Standardzeit 3/10/2013 um 12:00 Uhr (UTC-08: 00) als 3/10/2013 8:00 UTC und die 3/11/2013 12:00 Uhr pazifische Sommerzeit (UTC-08: 00) gespeichert. UTC-07: 00) wird als 11.03.2013 7:00 UTC gespeichert. An diesem Tag beträgt die Ortszeit von Mitternacht bis Mitternacht in UTC nur 23 Stunden!Obwohl ein Tag in der Ortszeit mehr oder weniger als 24 Stunden haben kann, beträgt ein Tag in UTC immer genau 24 Stunden. 1 Die
daysBetween
oben gezeigte Methode nutzt diese Tatsache aus, indem sie zuerst aufrufttreatAsUTC
, um beide Ortszeiten auf Mitternacht UTC einzustellen, bevor sie subtrahiert und dividiert wird.1. JavaScript ignoriert Schaltsekunden.
quelle
Date.UTC(...)
.Der einfachste Weg, um den Unterschied zwischen zwei Daten zu ermitteln:
Sie erhalten die Differenztage (oder NaN, wenn einer oder beide nicht analysiert werden konnten). Das Analysedatum gab das Ergebnis in Millisekunden an. Um es nach Tag zu erhalten, müssen Sie es durch 24 * 60 * 60 * 1000 teilen
Wenn Sie möchten, dass es durch Tage, Stunden, Minuten, Sekunden und Millisekunden geteilt wird:
Hier ist meine überarbeitete Version der James-Version:
quelle
Ich empfehle die Verwendung der Bibliothek moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Es geht richtig mit der Sommerzeit um und eignet sich im Allgemeinen hervorragend zum Arbeiten.
Beispiel:
quelle
end.diff(start,"days")
obwohl der geschriebene Code funktioniert, da das Startdatum nach dem Enddatum liegt!Ich würde weitermachen und dieses kleine Dienstprogramm greifen, und darin finden Sie Funktionen für Sie. Hier ist ein kurzes Beispiel:
quelle
Update: Ich weiß, dass dies nicht Teil Ihrer Fragen ist, aber im Allgemeinen würde ich nicht empfehlen, eine Datumsberechnung oder -manipulation in Vanille-JavaScript durchzuführen und stattdessen aufgrund vieler Randfälle eine Bibliothek wie date-fns oder moment.js zu verwenden.
quelle
timeDiff
der negativ zurückgekehrt ist? Sollte nichttimeDiff
sein(new Date(endDate)) - (new Date(startDate));
?(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
const timeDiff = +(new Date(start)) - +(new Date(end));
return (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
Verwenden von Moment.js
quelle
var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays);
hier mehr: momentjs.comDatumswerte in JS sind Datums- / Uhrzeitwerte.
Direkte Datumsberechnungen sind also inkonsistent:
Zum Beispiel müssen wir das 2. Datum konvertieren:
Die Methode könnte darin bestehen, die Mühlen an beiden Daten abzuschneiden:
quelle
Es ist besser, DST, Math.ceil, Math.floor usw. mithilfe von UTC-Zeiten zu entfernen:
Dieses Beispiel gibt einen Unterschied von 109 Tagen.
24*60*60*1000
ist ein Tag in Millisekunden.quelle
Um Tage zwischen zwei angegebenen Daten zu berechnen, können Sie den folgenden Code verwenden. Die hier verwendeten Daten sind der 01. Januar 2016 und der 31. Dezember 2016
quelle
Mit der folgenden Formel kann eine Differenz der vollständigen Proof-Tage zwischen zwei Daten berechnet werden, die auf verschiedenen TZs liegen:
quelle
Ich habe diese Frage gefunden, wenn ich an zwei Daten rechnen möchte, aber das Datum hat Stunden- und Minutenwerte. Ich habe die Antwort von @ michael-liu an meine Anforderungen angepasst und sie hat meinen Test bestanden.
diff Tage
2012-12-31 23:00
und2013-01-01 01:00
sollte gleich 1. (2 Stunden) diff Tage2012-12-31 01:00
und2013-01-01 23:00
sollte gleich 1. (46 Stunden)quelle
jsfiddle Beispiel :)
quelle
Ich denke, die Lösungen sind nicht 100% korrekt. Ich würde Decke anstelle von Boden verwenden . Rund wird funktionieren, aber es ist nicht die richtige Operation.
quelle
Was ist mit formatDate aus dem DatePicker-Widget? Sie können es verwenden, um die Daten im Zeitstempelformat (Millisekunden seit dem 01.01.1970) zu konvertieren und dann eine einfache Subtraktion durchzuführen.
quelle
quelle
Dies ist vielleicht nicht die eleganteste Lösung, aber es scheint die Frage mit einem relativ einfachen Stück Code zu beantworten, denke ich. Kannst du so etwas nicht benutzen:
Dies setzt voraus, dass Sie Datumsobjekte als Parameter übergeben.
quelle
Wenn Sie zwei Unix-Zeitstempel haben, können Sie diese Funktion verwenden (aus Gründen der Übersichtlichkeit etwas ausführlicher):
Beispiel:
quelle
Seien Sie vorsichtig, wenn Sie Millisekunden verwenden .
Date.getTime () gibt Millisekunden zurück, und für die Ausführung von mathematischen Operationen mit Millisekunden muss eingeschlossen werden
Das Beispiel aus dem obigen Kommentar ist die beste Lösung, die ich bisher gefunden habe: https://stackoverflow.com/a/11252167/2091095 . Verwenden Sie jedoch +1 für das Ergebnis, wenn Sie möchten, dass alle beteiligten Tage gezählt werden.
quelle
quelle
Ich hatte das gleiche Problem in Angular. Ich mache die Kopie, weil er sonst das erste Date überschreibt. Beide Daten müssen die Zeit 00:00:00 haben (offensichtlich)
quelle
Ich habe den folgenden Code verwendet, um die Funktionalität des Buchungsdatums für einen Nachrichtenbeitrag zu testen. Ich berechne die Minute oder Stunde oder den Tag oder das Jahr basierend auf dem Buchungsdatum und dem aktuellen Datum.
quelle
Wenn Sie ein DateArray mit Datumsangaben haben möchten, versuchen Sie Folgendes:
DebugSnippet
quelle
Die einfache Möglichkeit, Tage zwischen zwei Daten zu berechnen, besteht darin, beide Zeitkomponenten zu entfernen, dh Stunden, Minuten, Sekunden und Millisekunden auf 0 zu setzen, ihre Zeit zu subtrahieren und mit Millisekunden im Wert von einem Tag zu tauchen.
quelle
new Date
quelle
Einfach, leicht und raffiniert. Diese Funktion wird alle 1 Sekunde aufgerufen, um die Zeit zu aktualisieren.
quelle
Eine bessere Lösung von
Es wird 0 zurückgegeben, wenn beide Daten gleich sind.
quelle
Ein Beitrag für das Datum vor dem 01.01.1970 und nach dem 19.01.2038
quelle
quelle
Sie können UnderscoreJS zum Formatieren und Berechnen von Differenzen verwenden.
Demo https://jsfiddle.net/sumitridhal/8sv94msp/
quelle