Wie würde ich die Differenz für zwei Date () -Objekte in JavaScript berechnen und dabei nur die Anzahl der Monate in der Differenz zurückgeben?
Jede Hilfe wäre toll :)
javascript
date
datediff
williamtroup
quelle
quelle
Antworten:
Die Definition von "Anzahl der Monate in der Differenz" wird vielfach interpretiert. :-)
Sie können das Jahr, den Monat und den Tag des Monats aus einem JavaScript-Datumsobjekt abrufen. Je nachdem, nach welchen Informationen Sie suchen, können Sie anhand dieser Informationen herausfinden, wie viele Monate zwischen zwei Zeitpunkten liegen.
Zum Beispiel von der Stange:
Code-Snippet anzeigen
(Beachten Sie, dass Monatswerte in JavaScript mit 0 = Januar beginnen.)
Das Einbeziehen von Bruchmonaten in das oben Gesagte ist viel komplizierter, da drei Tage in einem typischen Februar einen größeren Bruchteil dieses Monats (~ 10,714%) darstellen als drei Tage im August (~ 9,677%), und natürlich ist sogar der Februar ein bewegliches Ziel je nachdem ob es ein Schaltjahr ist.
Es gibt auch einige Datums- und Zeitbibliotheken für JavaScript, die diese Art von Dingen wahrscheinlich einfacher machen.
Hinweis : Hier war früher ein
+ 1
:Das liegt daran, dass ich ursprünglich gesagt habe:
Ich habe es aus zwei Gründen entfernt:
Teilmonate nicht zu zählen, stellt sich als nicht das heraus, was viele (die meisten?) Leute, die zur Antwort kommen, wollen, also dachte ich, ich sollte sie trennen.
Selbst nach dieser Definition hat es nicht immer funktioniert. :-D (Entschuldigung.)
quelle
Wenn Sie den Tag des Monats nicht berücksichtigen, ist dies bei weitem die einfachere Lösung
Beachten Sie, dass der Monatsindex auf 0 basiert. Dies bedeutet, dass
January = 0
undDecember = 11
.quelle
Manchmal möchten Sie vielleicht nur die Anzahl der Monate zwischen zwei Daten erhalten, ohne den Tagesteil zu beachten. Wenn Sie beispielsweise zwei Daten hatten - 2013/06/21 und 2013/10 / 18- und sich nur um die Teile 2013/06 und 2013/10 gekümmert haben, sind hier die Szenarien und möglichen Lösungen aufgeführt:
1.Wenn Sie nur die Anzahl der Monate zwischen den beiden Daten ohne Monat1 und Monat2 möchten
2.Wenn Sie einen der Monate einbeziehen möchten
3.Wenn Sie beide Monate einbeziehen möchten
quelle
numberOfMonths=(year2-year1)*12+(month2-month1)+1;
was das gleiche tut, aber für mich semantisch korrekter istHier ist eine Funktion, die die Anzahl der Monate zwischen zwei Daten genau angibt.
Das Standardverhalten zählt nur ganze Monate, z. B. 3 Monate und 1 Tag ergibt eine Differenz von 3 Monaten. Sie können dies verhindern, indem Sie den
roundUpFractionalMonths
Parameter auf festlegentrue
, sodass eine Differenz von 3 Monaten und 1 Tag als 4 Monate zurückgegeben wird.Die oben akzeptierte Antwort (die Antwort von TJ Crowder) ist nicht korrekt und gibt manchmal falsche Werte zurück.
Zum Beispiel
monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015'))
Rückgaben,0
die offensichtlich falsch sind. Die korrekte Differenz beträgt entweder 1 ganzen Monat oder 2 Monate aufgerundet.Hier ist die Funktion, die ich geschrieben habe:
quelle
Wenn Sie volle Monate zählen müssen, unabhängig davon, ob der Monat 28, 29, 30 oder 31 Tage beträgt. Unten sollte funktionieren.
Dies ist eine erweiterte Version der Antwort https://stackoverflow.com/a/4312956/1987208 , behebt jedoch den Fall, in dem 1 Monat für den Fall vom 31. Januar bis 1. Februar (1 Tag) berechnet wird.
Dies wird Folgendes abdecken:
quelle
Unterschied in Monaten zwischen zwei Daten in JavaScript:
Gesamtmonate zwischen Startdatum und Enddatum:
quelle
Ich weiß, dass dies wirklich spät ist, aber es trotzdem zu posten, nur für den Fall, dass es anderen hilft. Hier ist eine Funktion, die ich mir ausgedacht habe und die anscheinend die Unterschiede in Monaten zwischen zwei Daten gut zählt. Es ist zwar viel schlüpfriger als das von Mr. Crowder, liefert jedoch genauere Ergebnisse, indem es durch das Datumsobjekt geht. Es ist in AS3, aber Sie sollten nur in der Lage sein, die starke Eingabe zu löschen, und Sie werden JS haben. Fühlen Sie sich frei, es schöner zu machen, wenn Sie jemanden da draußen suchen!
quelle
Betrachten Sie jedes Datum in Monaten und subtrahieren Sie es, um den Unterschied zu ermitteln.
Dadurch erhalten Sie die Differenz der Monate zwischen den beiden Daten, wobei die Tage ignoriert werden.
quelle
Um die Antwort von @ TJ zu erweitern: Wenn Sie nach einfachen Monaten anstatt nach vollen Kalendermonaten suchen, können Sie einfach überprüfen, ob das Datum von d2 größer oder gleich d1 ist. Das heißt, wenn d2 später in seinem Monat ist als d1 in seinem Monat, dann gibt es 1 weiteren Monat. Sie sollten also in der Lage sein, dies einfach zu tun:
Dies berücksichtigt Zeitprobleme nicht vollständig (z. B. 3. März um 16:00 Uhr und 3. April um 15:00 Uhr), ist jedoch genauer und gilt nur für ein paar Codezeilen.
quelle
Es gibt zwei Ansätze: mathematisch und schnell, jedoch mit Abweichungen im Kalender oder iterativ und langsam, die jedoch alle Kuriositäten behandeln (oder zumindest Delegierte, die sie bearbeiten, in eine gut getestete Bibliothek).
Wenn Sie den Kalender durchlaufen, erhöhen Sie das Startdatum um einen Monat und prüfen, ob das Enddatum überschritten wird. Diese Delegierten Anomalie-Behandlung auf die integrierte Date () Klassen, aber langsam sein könnte IF Sie dies für eine große Anzahl von Terminen tun. James 'Antwort folgt diesem Ansatz. So sehr ich die Idee nicht mag, denke ich, dass dies der "sicherste" Ansatz ist, und wenn Sie nur eine Berechnung durchführen, ist der Leistungsunterschied wirklich vernachlässigbar. Wir neigen dazu, Aufgaben zu optimieren, die nur einmal ausgeführt werden.
Jetzt, wenn Sie diese Funktion auf einem Datensatz sind zu berechnen, werden Sie wahrscheinlich nicht wollen , dass die Funktion in jeder Zeile (oder Gott bewahre, mehrmals pro Datensatz) laufen. In diesem Fall können Sie fast jede der anderen Antworten hier verwenden, außer der akzeptierten Antwort, die einfach falsch ist (Unterschied zwischen
new Date()
undnew Date()
ist -1).Hier ist mein Versuch eines mathematisch-schnellen Ansatzes, der unterschiedliche Monatslängen und Schaltjahre berücksichtigt. Sie sollten eine solche Funktion wirklich nur verwenden, wenn Sie sie auf einen Datensatz anwenden (diese Berechnung immer wieder durchführen). Wenn Sie dies nur einmal tun müssen, verwenden Sie den oben beschriebenen iterativen Ansatz von James, da Sie die Behandlung aller (vielen) Ausnahmen an das Date () -Objekt delegieren.
quelle
Hier gehen Sie einen anderen Ansatz mit weniger Schleifen:
quelle
Sie können diese Lösung auch in Betracht ziehen. Dies
function
gibt die monatliche Differenz in Ganzzahl oder Zahl zurückDas Übergeben des Startdatums als erstes oder letztes
param
ist fehlertolerant. Das heißt, die Funktion würde immer noch den gleichen Wert zurückgeben.quelle
Berechnen Sie die Differenz zwischen zwei Daten einschließlich des Bruchteils des Monats (Tage).
quelle
Dies sollte gut funktionieren:
quelle
quelle
Der folgende Code gibt volle Monate zwischen zwei Daten zurück, wobei auch die Anzahl der Tage von Teilmonaten berücksichtigt wird.
quelle
}}
quelle
Die folgende Logik wird die Differenz in Monaten ermitteln
quelle
quelle
Sehen Sie, was ich benutze:
quelle
quelle
Anzahl der Monate, in denen Tag und Uhrzeit keine Rolle spielen
In diesem Fall geht es mir nicht um volle Monate, Teilmonate, wie lange ein Monat ist usw. Ich muss nur die Anzahl der Monate kennen. Ein relevanter Fall in der realen Welt wäre, wenn jeden Monat ein Bericht fällig wird und ich wissen muss, wie viele Berichte es geben sollte.
Beispiel:
Dies ist ein ausgearbeitetes Codebeispiel, um zu zeigen, wohin die Zahlen gehen.
Nehmen wir 2 Zeitstempel, die 4 Monate ergeben sollten
Kann mit Ihrer Zeitzone / Zeit etwas anders sein. Der Tag, die Minuten und die Sekunden spielen keine Rolle und können in den Zeitstempel aufgenommen werden, aber wir werden ihn bei unserer tatsächlichen Berechnung nicht berücksichtigen.
Schritt 1: Konvertieren Sie den Zeitstempel in ein JavaScript-Datum
Schritt 2: Holen Sie sich ganzzahlige Werte für die Monate / Jahre
Das gibt uns
Schritt 3:
(12 * (endYear - startYear)) + 1
Zum Endmonat hinzufügen.2 + (12 * (2020 - 2019)) + 1 = 15
Schritt 4: Subtrahieren Sie die Monate
15 - 11 = 4
;; Wir bekommen unser 4-Monats-Ergebnis.29 Monate Beispiel Beispiel
November 2019 bis März 2022 sind 29 Monate. Wenn Sie diese in eine Excel-Tabelle einfügen, werden 29 Zeilen angezeigt.
3 + (12 * (2022-2019)) + 1
40 - 11 = 29
quelle
quelle
Ein Ansatz wäre, einen einfachen Java-Webdienst (REST / JSON) zu schreiben, der die JODA-Bibliothek verwendet
http://joda-time.sourceforge.net/faq.html#datediff
um die Differenz zwischen zwei Daten zu berechnen und diesen Dienst über Javascript aufzurufen.
Dies setzt voraus, dass sich Ihr Backend in Java befindet.
quelle