Moment: Ist es eine Möglichkeit, .add()- oder .subtract()-Float-Werte zu erstellen?

Erstellt am 20. Juni 2015  ·  3Kommentare  ·  Quelle: moment/moment

moment().add(1, "months") // >> Mon Jul 20 2015 13:36:12 GMT+0200
moment().add(1.9, "months") // >> Mon Jul 20 2015 13:36:12 GMT+0200
// Excpected: Mon Aug 17 2015 09:34:37 GMT+0200

Im Moment muss ich tun:

var duration = moment.duration(1.9, "months"); 
var ms = duration.asMilliseconds();
var date = moment().add(ms, "ms");

Warum können diese Methoden keine Float-Werte addieren oder subtrahieren?

Hilfreichster Kommentar

Dies ist beabsichtigt, könnte aber in der Dokumentation wahrscheinlich besser erklärt werden.

Sie können Dezimalzahlen beim Addieren oder Subtrahieren von Stunden, Minuten, Sekunden oder Millisekunden verwenden, aber Sie können keine Tage oder größere Komponenten unterteilen.

Der Grund dafür ist, dass es einen logischen Unterschied zwischen Zeit- und Datumsberechnung gibt.

Zeitmathematik geht von einer linearen Zeitskala aus, bei der nur der UTC-basierte Zeitstempel erhöht oder verringert wird. Dies verarbeitet DST-Übergänge in Echtzeit. Für die meisten Orte in den Vereinigten Staaten wäre 2015-03-08T01:00:00 plus eine Stunde beispielsweise 2015-03-08T03:00:00 da die Stunde von 2:00 bis 3:00 Uhr für den DST-Übergang übersprungen wurde.

Datumsmathematik verwendet keine lineare Zeitskala, sondern verwendet die Datumsangaben im Kalender. Im gleichen Beispiel wäre 2015-03-08T01:00:00 plus ein _day_ 2015-03-09T01:00:00 , obwohl nur 23 Stunden vergangen sind. Daher ist ein "Tag" in diesem Zusammenhang keine feste Zeitdauer, und eine Unterteilung wäre daher unsinnig. (Wäre ein halber Tag 12 Stunden später oder 11,5 Stunden später an diesem Tag?)

Bedenken Sie auch ohne Sommerzeit, dass nicht alle Monate 30 Tage und nicht alle Jahre 365 Tage haben. "Hinzufügen" eines Jahres bedeutet nicht wirklich "365 Tage hinzufügen", sondern "die Position im Kalender auf denselben Monat und Tag im nächsten Jahr verschieben". Dies führt zu bestimmten Mehrdeutigkeiten, beispielsweise wenn in einem Schaltjahr ein Jahr zum 29. Februar hinzugefügt wird und in einem Nicht-Schaltjahr endet. Wir entscheiden uns, am 28. Februar zu landen, aber die Landung am 1. März wäre genauso gültig.

Betrachten Sie als weiteres Beispiel, dass der 31. August plus einen Monat minus einen Monat der 30. August ist.

Da die Datumsmathematik nicht den normalen Additions- und Subtraktionsregeln der Mathematik folgt, kann sie auch keine Divisions- oder Multiplikationsoperationen verarbeiten, und daher können Sie keine 1,9 Monate addieren.

Um es anders zu denken, was würden Sie erwarten, dass das Ergebnis von Mitternacht des 15. Juni + 1,5 Monate ist? Jeder der folgenden Schritte kann von einem Menschen ausgeführt werden:

  • 2015-06-15T00:00 + (0,5 * 30 Tage im Juni) = 2015-06-30T00:00 + (1 Monat = 30 Tage) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0,5 * 30 Tage im Juni) = 2015-06-30T00:00 + (1 Monat = 31 Tage) = 2015-07-31T00:00
  • 2015-06-15T00:00 + 1 Monat = 2015-07-15T00:00 + (0,5 * 31 Tage im Juli) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 Tage im Juni und Juli / 2 = 30,5 durchschnittliche Tage in diesen Monaten) * 1,5 Monate = 45,75 Tage] = 2015-07-30T18:00

Hier sind also vier verschiedene Antworten, die alle logische Ergebnisse sind - weshalb Sie bei der Datumsberechnung keine Einheiten unterteilen können.

Alle 3 Kommentare

Dies ist beabsichtigt, könnte aber in der Dokumentation wahrscheinlich besser erklärt werden.

Sie können Dezimalzahlen beim Addieren oder Subtrahieren von Stunden, Minuten, Sekunden oder Millisekunden verwenden, aber Sie können keine Tage oder größere Komponenten unterteilen.

Der Grund dafür ist, dass es einen logischen Unterschied zwischen Zeit- und Datumsberechnung gibt.

Zeitmathematik geht von einer linearen Zeitskala aus, bei der nur der UTC-basierte Zeitstempel erhöht oder verringert wird. Dies verarbeitet DST-Übergänge in Echtzeit. Für die meisten Orte in den Vereinigten Staaten wäre 2015-03-08T01:00:00 plus eine Stunde beispielsweise 2015-03-08T03:00:00 da die Stunde von 2:00 bis 3:00 Uhr für den DST-Übergang übersprungen wurde.

Datumsmathematik verwendet keine lineare Zeitskala, sondern verwendet die Datumsangaben im Kalender. Im gleichen Beispiel wäre 2015-03-08T01:00:00 plus ein _day_ 2015-03-09T01:00:00 , obwohl nur 23 Stunden vergangen sind. Daher ist ein "Tag" in diesem Zusammenhang keine feste Zeitdauer, und eine Unterteilung wäre daher unsinnig. (Wäre ein halber Tag 12 Stunden später oder 11,5 Stunden später an diesem Tag?)

Bedenken Sie auch ohne Sommerzeit, dass nicht alle Monate 30 Tage und nicht alle Jahre 365 Tage haben. "Hinzufügen" eines Jahres bedeutet nicht wirklich "365 Tage hinzufügen", sondern "die Position im Kalender auf denselben Monat und Tag im nächsten Jahr verschieben". Dies führt zu bestimmten Mehrdeutigkeiten, beispielsweise wenn in einem Schaltjahr ein Jahr zum 29. Februar hinzugefügt wird und in einem Nicht-Schaltjahr endet. Wir entscheiden uns, am 28. Februar zu landen, aber die Landung am 1. März wäre genauso gültig.

Betrachten Sie als weiteres Beispiel, dass der 31. August plus einen Monat minus einen Monat der 30. August ist.

Da die Datumsmathematik nicht den normalen Additions- und Subtraktionsregeln der Mathematik folgt, kann sie auch keine Divisions- oder Multiplikationsoperationen verarbeiten, und daher können Sie keine 1,9 Monate addieren.

Um es anders zu denken, was würden Sie erwarten, dass das Ergebnis von Mitternacht des 15. Juni + 1,5 Monate ist? Jeder der folgenden Schritte kann von einem Menschen ausgeführt werden:

  • 2015-06-15T00:00 + (0,5 * 30 Tage im Juni) = 2015-06-30T00:00 + (1 Monat = 30 Tage) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0,5 * 30 Tage im Juni) = 2015-06-30T00:00 + (1 Monat = 31 Tage) = 2015-07-31T00:00
  • 2015-06-15T00:00 + 1 Monat = 2015-07-15T00:00 + (0,5 * 31 Tage im Juli) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 Tage im Juni und Juli / 2 = 30,5 durchschnittliche Tage in diesen Monaten) * 1,5 Monate = 45,75 Tage] = 2015-07-30T18:00

Hier sind also vier verschiedene Antworten, die alle logische Ergebnisse sind - weshalb Sie bei der Datumsberechnung keine Einheiten unterteilen können.

Vielen Dank, dass Sie sich die Zeit genommen haben, diese sehr ausführliche Antwort zu schreiben. Ich verstehe die Logik hinter dem Betrieb dieser Funktionen besser.

Ich konnte nicht widerstehen, Matt zu danken, ich habe das gleiche Problem wie Delgan erlebt und Kumpel! deine Antwort ist so vollständig, danke.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen