Ich benutze moment.js jetzt seit kurzer Zeit, und es hat die Datumsmanipulation viel einfacher gemacht, aber ich habe einen bestimmten Fall, der fehlschlägt, und ich kann nicht sehen, warum.
Bei der Berechnung der Differenz zwischen heute (31. Oktober 2013) und dem 1. Februar 2014 ergibt die Monatsdifferenz 2, obwohl zwischen den beiden Daten 3 vollständige Monate und ein Tag liegen.
Der Unterschied zwischen dem 31. Oktober und dem 31. Januar funktioniert gut: 3 Monate und null Tage.
var mStartDate = moment([ periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate() ]);
var mTermDate = moment([ someDate.getFullYear(), someDate.getMonth(), someDate.getDate() ]);
console.log('periodStartDate: ' + periodStartDate);
console.log('someDate: ' + someDate);
// Years
var yearsDiff = mTermDate.diff(mStartDate, 'years');
// Months
var monthsDiff = mTermDate.diff(mStartDate, 'months', true);
Die Konsole protokolliert Folgendes:
periodStartDate: Thu Oct 31 2013 11:13:51 GMT+0000 (GMT)
someDate: Sat Feb 01 2014 11:13:51 GMT+0000 (GMT)
monthsDiff: 2
Wenn ich true als booleschen Wert übergebe, um nicht zu runden, ist der Monatsunterschied
monthsDiff: 2.983050847457627
Ist das nur ein Fehler in Moment.js.diff()? Jeder einzelne meiner anderen Testfälle wird erfolgreich bestanden.
Ich habe dies in Version 2.2.1 festgestellt – ich kann sehen, dass es auch mit 2.4.0 passiert
– Khain
31. Oktober 2013 um 11:45 Uhr
robertklep
Ich denke, das hat mit der ‘Sonderbehandlung’ zu tun, wie in beschrieben Das feine Handbuch:
Es ist so optimiert, dass zwei Monate mit demselben Datum immer eine ganze Zahl voneinander entfernt sind.
Der 15. Januar bis 15. Februar sollte also genau 1 Monat betragen.
28. Februar bis 28. März sollte genau 1 Monat sein.
28. Februar 2011 bis 28. Februar 2012 sollte genau 1 Jahr sein.
Moment.js wendet diese spezielle Handhabung beim Umgang mit an 31 Jan und 31 Oct (am selben Tag):
// 31 Oct 2013 - 1 Feb 2014
> moment([2014, 1, 1]).diff(moment([2013, 9, 31]), 'months', true)
2.983050847457627
// 31 Oct 2013 - 31 Jan 2014
> moment([2014, 0, 31]).diff(moment([2013, 9, 31]), 'months', true)
3
// 31 Oct 2013 - 30 Jan 2014
> moment([2014, 0, 30]).diff(moment([2013, 9, 31]), 'months', true)
2.967741935483871
Also die 2.98 -Wert korrekt ist, nur dass das zweite Beispiel das Ergebnis in eine Differenz von ‘Kalendermonaten’ umwandelt.
(was das Abrunden auf 2 betrifft, das ist auch auf der gleichen Seite dokumentiert)
Danke Robert. Aber ist es nicht seltsam, dass der Wert (bei der Berechnung der Differenz zum 31.01.) im Vergleich zum 30.01. steigt und dann wieder sinkt? Ich würde so etwas wie 2,967 erwarten, dann 3, dann 3,02 oder so ähnlich. Wenn zwischen zwei Daten 3 vollständige Monate liegen, wie kann es weniger sein, wenn ich einen Tag hinzufüge? Die andere Sache, die ich nach all dem mache, ist, dass ich den Unterschied in einer “X Monate und Y Tage”-Weise zeige. Also … wenn es 2 Monate gibt, bringt mich das zum 31.12, und dann sind es 32 Tage, um den 1. Februar zu erreichen.
– Khain
31. Oktober 2013 um 12:26 Uhr
@Khain, weil der Tageswert gleich ist, wird der Wert auf eine ganze Zahl geklemmt (das ist die “Sonderbehandlung”). Für die anderen Daten wird nicht geklemmt und der genaue (Gleitkomma-) Wert verwendet.
– robertklep
31. Oktober 2013 um 13:00 Uhr
@robertklep meinst du Moment ([2013, 10, 31]).unterschied ? Kann ein Tippfehler sein?
– Flüssiggas
7. April 2016 um 15:10 Uhr
@LPG Sie wollen eine Instanz erstellen, die den 31. Oktober darstellt? Das sollte sein moment([2013, 9, 31]) (da Monate 0-indiziert sind, ist 0 also Januar, 1 ist Februar usw.).
– robertklep
7. April 2016 um 19:09 Uhr
HerrB
Ich bin einen anderen Weg gegangen, um den Unterschied zwischen zwei Monaten zu ermitteln
function getAbsoluteMonths(momentDate) {
var months = Number(momentDate.format("MM"));
var years = Number(momentDate.format("YYYY"));
return months + (years * 12);
}
var startMonths = getAbsoluteMonths(start);
var endMonths = getAbsoluteMonths(end);
var monthDifference = endMonths - startMonths;
Das machte für mich Sinn und da Moment einige seltsame Dinge mit Diff macht, habe ich mich entschieden, klarzustellen, wie mein Ergebnis aussehen wird.
Geben Sie aus der Bibliothek für den letzten Moment einfach d.month() + d.year()*12 zurück
– windmaomao
16. August 2017 um 13:05 Uhr
Warum die Jahre mit 12 multiplizieren? würde dies nicht das gleiche Ergebnis ohne das erreichen?
– lrossig
27. Dezember 2017 um 18:57 Uhr
Ich habe 12 gemacht, denn wenn unser Start 04-2017 ist und unser Ende 01-2018 ist, wenn Sie nur die Monate + das Jahr nehmen würden, würden Sie 2021 – 2019 = 4 erhalten, was ich nach 9 suche.
– HerrB
11. Mai 2018 um 2:37 Uhr
Einfache und einfache Lösung mit korrekter Wertdifferenz zwischen zwei Monaten, wenn Sie die Momentbibliothek verwenden
Ich habe dies in Version 2.2.1 festgestellt – ich kann sehen, dass es auch mit 2.4.0 passiert
– Khain
31. Oktober 2013 um 11:45 Uhr