Eine korrektere Lösung
... da die Daten natürlich Zeitzoneninformationen enthalten, die sich auf Regionen mit unterschiedlichen Sommerzeitregelungen erstrecken können
Die bisherigen Antworten auf diese Frage berücksichtigen nicht die Fälle, in denen die beiden fraglichen Daten eine Sommerzeitumstellung umfassen. Das Datum, an dem die Sommerzeitumstellung stattfindet, hat eine Dauer in Millisekunden, die != 1000*60*60*24
so dass die typische Berechnung fehlschlägt.
Sie können dieses Problem umgehen, indem Sie die beiden Daten zunächst auf UTC normalisieren und dann die Differenz zwischen diesen beiden UTC-Daten berechnen.
Die Lösung kann nun wie folgt geschrieben werden,
const _MS_PER_DAY = 1000 * 60 * 60 * 24;
// a and b are javascript Date objects
function dateDiffInDays(a, b) {
// Discard the time and time-zone information.
const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}
// test it
const a = new Date("2017-01-01"),
b = new Date("2017-07-25"),
difference = dateDiffInDays(a, b);
Dies funktioniert, weil die UTC-Zeit nie die Sommerzeit einhält. Siehe Wird in UTC die Sommerzeit eingehalten?
p.s. Nach der Diskussion einige der Kommentare zu dieser Antwort, sobald Sie die Probleme mit Javascript Daten, die eine DST-Grenze überspannen verstanden haben, gibt es wahrscheinlich mehr als nur eine Möglichkeit, es zu lösen. Was ich oben zur Verfügung gestellt ist eine einfache (und getestet) Lösung. Ich würde daran interessiert sein, zu wissen, ob es eine einfache arithmetische/math-basierte Lösung, anstatt die zwei neuen Date-Objekte zu instanziieren ist. Das könnte möglicherweise schneller sein.
49 Stimmen
Nur eine Randbemerkung: Erstellen Sie keine Date-Objekte mit dieser Art von Strings als Eingabe; es ist nicht standardisiert und hängt vom Browser ab, wie diese geparst werden. Verwenden Sie Strings, die geparst werden können von Datum.parsen oder besser gesagt, verwenden Sie drei numerische Werte als Argumente für
new Date
z.B.new Date(2010, 11, 7);
.4 Stimmen
Nebenbemerkung: Vertrauen Sie niemals der Systemzeit auf der Client-Seite! Sie ist oft falsch, und Sie könnten Ihre Anwendung zerstören.
0 Stimmen
Versuchen Sie auch eine kleine Funktion unter stackoverflow.com/a/53092438/3787376 .
6 Stimmen
@Edward, du nennst das wirklich eine KLEINE Funktion? :)
1 Stimmen
Das ist unlösbar. 1) 7/11/2010 könnte der 11. Juli oder der 7. November sein. 2) Welche Zeitzone? Dies könnte die Datumsgrenze überschreiten. 3) Ohne Zeitangabe beträgt die Genauigkeit +/- 1 Tag. 4) Das Ergebnis könnte - sein, obwohl es eigentlich positiv ist (oder umgekehrt), da es keine Zeit/Zeitzone gibt.