Ich suche nach der einfachsten und saubersten Möglichkeit, einem JavaScript-Datum X Monate hinzuzufügen.
Ich würde lieber nicht mit dem Rollover des Jahres umgehen oder meine eigene Funktion schreiben müssen .
Ist etwas eingebaut, das dies kann?
javascript
date
Tschad
quelle
quelle
Antworten:
Die folgende Funktion fügt einem Datum in JavaScript ( Quelle ) Monate hinzu . Dabei werden Jahresüberschreitungen und unterschiedliche Monatslängen berücksichtigt:
Die obige Lösung deckt den Randfall des Verschiebens von einem Monat mit einer größeren Anzahl von Tagen als dem Zielmonat ab. z.B.
Wenn sich der Tag des Monats bei der Bewerbung ändert
setMonth
, wissen wir, dass wir aufgrund einer unterschiedlichen Monatslänge in den folgenden Monat übergelaufen sind. In diesem Fall kehren wirsetDate(0)
zum letzten Tag des Vormonats zurück.Hinweis: Diese Version dieser Antwort ersetzt eine frühere Version (unten), die unterschiedliche Monatslängen nicht ordnungsgemäß verarbeitet hat.
quelle
addMonths
Funktion , die das Monatsende berücksichtigt (z. B.2012-01-31 + 1 month = 2012-02-29
und so weiter).Ich verwende die Bibliothek moment.js für Manipulationen von Datum und Uhrzeit . Beispielcode zum Hinzufügen eines Monats:
quelle
Diese Funktion behandelt Randfälle und ist schnell:
Prüfung:
Update für Nicht-UTC-Daten: (von A.Hatchkins)
Prüfung:
quelle
Da keine dieser Antworten das aktuelle Jahr berücksichtigt, in dem sich der Monat ändert, finden Sie eine, die ich unten erstellt habe und die damit umgehen sollte:
Die Methode:
Verwendung:
quelle
Entnommen aus den Antworten von @bmpsini und @Jazaret , aber ohne Erweiterung von Prototypen: Verwenden einfacher Funktionen ( Warum ist das Erweitern nativer Objekte eine schlechte Praxis? ):
Benutze es:
quelle
Aus den obigen Antworten geht hervor, dass der einzige, der die Randfälle behandelt (bmpasini aus der datejs-Bibliothek), ein Problem hat:
OK aber:
schlechter :
Dies liegt daran, dass die Zeit nicht eingestellt ist und somit auf 00:00:00 zurückgesetzt wird, was aufgrund von Zeitzonen- oder zeitsparenden Änderungen oder was auch immer zu Störungen am Vortag führen kann ...
Hier ist meine vorgeschlagene Lösung, die dieses Problem nicht hat und meiner Meinung nach auch insofern eleganter ist, als sie nicht auf fest codierten Werten beruht.
Gerät erfolgreich getestet mit:
quelle
Wie die meisten Antworten hervorhoben, könnten wir die setMonth () -Methode zusammen mit der getMonth () -Methode verwenden, um einem bestimmten Datum eine bestimmte Anzahl von Monaten hinzuzufügen.
Beispiel: (wie von @ChadD in seiner Antwort erwähnt.)
Wir sollten diese Lösung jedoch sorgfältig verwenden, da wir Probleme mit Randfällen bekommen.
Um Randfälle zu behandeln, ist die Antwort unter folgendem Link hilfreich.
https://stackoverflow.com/a/13633692/3668866
quelle
Einfache Lösung:
2678400000
31 Tage in MillisekundenAktualisieren:
Verwenden Sie diese Daten, um unsere eigene Funktion aufzubauen:
2678400000
- 31 Tage2592000000
- 30 Tage2505600000
- 29 Tage2419200000
- 28 Tagequelle
Monate haben einen 0-basierten Index, er sollte alarmieren (4), was 5 ist (Mai);
quelle
Nur um die akzeptierte Antwort und die Kommentare zu ergänzen.
quelle
Ich habe diese alternative Lösung geschrieben, die für mich gut funktioniert. Dies ist nützlich, wenn Sie das Ende eines Vertrags berechnen möchten. Beispiel: Start = 15.01.2016, Monate = 6, Ende = 14.07.2016 (dh letzter Tag - 1):
Beispiele:
quelle
Im Folgenden finden Sie ein Beispiel für die Berechnung eines zukünftigen Datums basierend auf der Datumseingabe (Mitgliedschaftssignup_Datum) + hinzugefügten Monaten (Mitgliedschaftsmonate) über Formularfelder.
Das Feld für Mitgliedschaftsmonate hat den Standardwert 0
Trigger-Link (kann ein Onchange-Ereignis sein, das an das Feld für den Mitgliedsbegriff angehängt ist):
quelle
Wie viele der komplizierten, hässlichen Antworten zeigen, können Datum und Uhrzeit für Programmierer, die jede Sprache verwenden, ein Albtraum sein. Mein Ansatz besteht darin, Datumsangaben und Delta-t-Werte in Epochenzeit (in ms) umzuwandeln, eine beliebige Arithmetik durchzuführen und dann wieder in "menschliche Zeit" umzuwandeln.
Dies wurde für einen etwas anderen Anwendungsfall geschrieben, aber Sie sollten es leicht für verwandte Aufgaben anpassen können.
EDIT: Vollständige Quelle hier !
quelle
All dies scheint viel zu kompliziert und ich denke, es kommt zu einer Debatte darüber, was genau das Hinzufügen von "einem Monat" bedeutet. Bedeutet das 30 Tage? Bedeutet das vom 1. bis zum 1.? Vom letzten bis zum letzten Tag?
Wenn letzteres der Fall ist, führt das Hinzufügen eines Monats zum 27. Februar zum 27. März, das Hinzufügen eines Monats zum 28. Februar zum 31. März (außer in Schaltjahren, in denen Sie zum 28. März gelangen). Wenn Sie dann einen Monat vom 30. März abziehen, erhalten Sie ... 27. Februar? Wer weiß...
Wenn Sie nach einer einfachen Lösung suchen, fügen Sie einfach Millisekunden hinzu und fertig.
oder
quelle
d.setMonth(d.getMonth()+1)
? Das ist also nicht einmal die einfachste Idee.quelle
Manchmal nützlich, um ein Datum von einem Operator zu erstellen, wie in BIRT-Parametern
Ich habe 1 Monat zurück gemacht mit:
quelle
Wie oben angegeben, können Sie der
Date
Funktion einen Monat hinzufügen .quelle