Moment.js Monate Unterschied

Lesezeit: 4 Minuten

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

Benutzeravatar von robertklep
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

Benutzeravatar von MrB
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

  const monthDifference =  moment(new Date(endDate)).diff(new Date(startDate), 'months', true);

Wenn Sie die Anzahl der Tage in endDate hinzufügen möchten

 const monthDifference = moment(new Date(endDate.add(1, 'days'))).diff(new Date(startDate), 'months', true);

Probieren Sie das aus method;

function getMonthDifference(startDate, endDate) {
    const increment = startDate.getMonth() === endDate.getMonth() ? 2 : 1;
    const diff = moment(endDate).diff(moment(startDate), 'months', true);
    return Math.ceil(diff) + increment;    // this increment is opitional and totally depends on your need.
}

1403560cookie-checkMoment.js Monate Unterschied

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy