Wie berechne ich das Datum in JavaScript drei Monate vor heute?

Lesezeit: 5 Minuten

Benutzer-Avatar
KeenUser

Ich versuche, ein Datum zu bilden, das 3 Monate vor dem aktuellen Datum liegt. Ich erhalte den aktuellen Monat durch den folgenden Code

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

Könnt ihr mir die Logik zur Berechnung und Bildung eines Datums (ein Objekt der Date Datentyp), wenn man bedenkt, dass, wenn der Monat Januar (1) ist, 3 Monate vor dem Datum Oktober (10) wäre?

Benutzer-Avatar
gilly3

var d = new Date();
d.setMonth(d.getMonth() - 3);

Das funktioniert für Januar. Führen Sie dieses Snippet aus:

var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());

Es gibt einige Vorbehalte …

Ein Monat ist eine merkwürdige Sache. Wie definierst du 1 Monat? 30 Tage? Die meisten Leute werden sagen, dass vor einem Monat derselbe Tag des Monats im Vormonat bedeutet Zitat benötigt. Aber mehr als die Hälfte der Zeit, das ist 31 Tage her, nicht 30. Und wenn heute der 31. des Monats ist (und es nicht August oder Dezember ist), existiert dieser Tag des Monats nicht im Vormonat.

Interessanterweise stimmt Google JavaScript zu, wenn Sie danach fragen welcher tag ist ein monat vor einem anderen tag:

Google-Suchergebnis für „einen Monat vor dem 31. März“ zeigt „3. März“

Das sagt es auch ein Monat ist 30,4167 Tage lang:
Das Google-Suchergebnis für „einen Monat in Tagen“ zeigt „30.4167“

Ist also ein Monat vor dem 31. März derselbe Tag wie ein Monat vor dem 28. März drei Tage früher? Das hängt alles davon ab, was Sie mit “einen Monat vorher” meinen. Sprechen Sie mit Ihrem Product Owner.

Wenn Sie es wie momentjs tun und diese Fehler am letzten Tag des Monats korrigieren möchten, indem Sie zum letzten Tag des Monats wechseln, können Sie Folgendes tun:

const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
    d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());

Wenn Ihre Anforderungen komplizierter sind, verwenden Sie etwas Mathematik und schreiben Sie Code. Sie sind Entwickler! Sie müssen keine Bibliothek installieren! Sie müssen nicht von Stackoverflow kopieren und einfügen! Sie können den Code selbst entwickeln, um genau das zu tun, was Sie brauchen!

  • var aktuellesDatum = neues Datum(); var aktuellerMonat = aktuellesDatum.getMonth() -12; var pastDate = neues Datum (2011, aktueller Monat, 01); alert(pastDate); das hat funktioniert, überprüft mit 12 Monaten

    – KeenUser

    29. Oktober 2011 um 6:09 Uhr


  • Das ist eine kranke Antwort … Woher bekomme ich 2012,0,15? Einen bestehenden Monat umwandeln -1 ?

    – Alex G

    8. August 2015 um 2:56 Uhr

  • @AlexG – Wenn Sie neu in der JavaScript-Datumsanalyse sind, kann ich sehen, wie verwirrend mein kurzes Beispiel wäre. JavaScript drückt Monate als nullbasiert aus, wobei Januar null ist. Um solche Verwirrung zu vermeiden, insbesondere da dies nichts mit der Frage oder meiner Antwort zu tun hat, habe ich meine Demo aktualisiert, um das Datum aus einer Zeichenfolge zu erhalten, was intuitiver sein sollte.

    – gilly3

    10. August 2015 um 0:27 Uhr

  • Ich weiß, das ist alt, aber wenn das Datum der 31. März ist und Sie mit dieser Methode einen Monat subtrahieren, ist das Ergebnis der 2. März. jsfiddle.net/atamata/rvumf7dg

    – atamata

    20. Januar 2017 um 13:10 Uhr


  • @atamata – Ja, das ist seltsam, aber vorhersehbar und erwartet. 31 Tage nach dem Ende des Vormonats für März ist der 31. März, aber für Februar ist es der 2. März. Wenn Sie ab dem Ende des Monats zählen möchten, müssen Sie dafür einen benutzerdefinierten Code schreiben.

    – gilly3

    20. Januar 2017 um 19:12 Uhr

Ich empfehle die Verwendung einer Bibliothek namens Moment.js.

Es ist gut getestet, funktioniert browserübergreifend und serverseitig (ich verwende es sowohl in Angular- als auch in Node-Projekten). Es hat eine großartige Unterstützung für lokale Daten.

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00

.format() gibt eine Zeichenfolgendarstellung des Datums zurück, das in formatiert ist ISO 8601 Format. Sie können es auch mit einem benutzerdefinierten Datumsformat wie diesem verwenden:.format('dddd, MMMM Do YYYY, h:mm:ss a')

Ein “Einzeiler” (auf vielen Zeilen zum einfachen Lesen)), der direkt in eine Variable eingefügt werden soll:

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);

  • Hübsch! Ich bin mir nicht sicher, ob es auf jedes Szenario anwendbar ist, scheint aber gut genug zu funktionieren.

    – Devin-Felder

    9. Oktober 2018 um 18:44 Uhr

Um die Dinge wirklich einfach zu machen, können Sie DateJS verwenden, eine Datumsbibliothek für JavaScript:

http://www.datejs.com/

Beispielcode für Sie:

Date.today().add({ months: -1 });

Benutzer-Avatar
Hodeifa Baswel

Dies sollte Addition/Subtraktion handhaben, geben Sie einfach einen negativen Wert zum Subtrahieren und einen positiven Wert zum Addieren ein. Dies löst auch das Problem der Monatsüberkreuzung.

function monthAdd(date, month) {
    var temp = date;
    temp = new Date(date.getFullYear(), date.getMonth(), 1);
    temp.setMonth(temp.getMonth() + (month + 1));
    temp.setDate(temp.getDate() - 1); 

    if (date.getDate() < temp.getDate()) { 
        temp.setDate(date.getDate()); 
    }

    return temp;    
}

Benutzer-Avatar
Niet the Dark Absol

Wenn die setMonth Die von gilly3 angebotene Methode ist nicht das, wonach Sie suchen, bedenken Sie Folgendes:

var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".

Kann beliebig lange verwendet werden, stellen Sie einfach die richtigen Vielfachen ein.

Benutzer-Avatar
Austin

Mach das

 let currentdate = new Date();
 let last3months = new Date(currentdate.setMonth(currentdate.getMonth()-3));

Javascripts setMonth Methode kümmert sich auch um das Jahr. Beispielsweise wird der obige Code zurückgegeben 2020-01-29 wenn aktuellesDatum eingestellt ist als new Date("2020-01-29")

  • Der Aufruf an currentdate.setMonth() Änderungen currentdateso dass keine Zuweisung erforderlich ist last3months zu einem neuen Date bezogen auf currentdate. Ebenfalls, currentdate ist nicht mehr das ‘aktuelle Datum’. Nur eine Anmerkung, die Sie bei der Verwendung dieser Lösung beachten sollten. 🙂

    – Philipp

    10. Dezember 2021 um 14:39 Uhr

  • Ja, es ist Call-by-Reference und ändert die Variable currentdate

    – Spock

    12. April um 8:25 Uhr

1299240cookie-checkWie berechne ich das Datum in JavaScript drei Monate vor heute?

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

Privacy policy