Start · Sprachen · JavaScript · Referenz · Date.prototype.setMonth()

Date.prototype.setMonth()

Methode

Setzt den Monat (0–11) und optional den Tag des Monats eines <code>Date</code>-Objekts in Ortszeit und gibt den neuen Zeitstempel zurück.

seit JavaScript ES1 (Baseline: alle Browser) Kategorie: method-property

Signatur

Date.prototype.setMonth(monthValue, dateValue)

Beschreibung

setMonth() ändert den Monat eines vorhandenen Date-Objekts. Die Methode rechnet in Ortszeit. Das Objekt wird direkt verändert, es entsteht also kein neues Objekt. Jahr, Uhrzeit und (ohne zweites Argument) der Tag des Monats bleiben erhalten.

Die Monate beginnen bei 0: 0 ist Januar, 11 ist Dezember. Werte außerhalb dieses Bereichs werden nicht abgelehnt, sondern auf das Jahr umgerechnet. 12 ergibt den Januar des Folgejahres, -1 den Dezember des Vorjahres. Deshalb kann man mit d.setMonth(d.getMonth() + n) ohne Weiteres Monate addieren oder abziehen.

Mit dem optionalen zweiten Argument dateValue setzt man Monat und Tag in einem Aufruf. Auch der Tag wird umgerechnet, wenn er zu groß oder zu klein ist. Ein gängiger Trick ist setMonth(m + 1, 0): Der Tag 0 steht für den letzten Tag des Vormonats, also für den letzten Tag von Monat m.

Wenn der Tag im Zielmonat nicht existiert, rechnet die Methode ihn in den nächsten Monat um. Ein Beispiel ist der 31. Januar, auf Februar gesetzt. Das ist der häufigste Fehler beim Rechnen mit Monaten.

Parameter

Name Typ Default Beschreibung
$monthValue Pflicht number Monat als ganze Zahl von 0 (Januar) bis 11 (Dezember). Werte außerhalb des Bereichs verschieben das Jahr entsprechend.
$dateValue number aktueller Tag (getDate()) Tag des Monats von 1 bis 31. 0 steht für den letzten Tag des Vormonats. Negative oder zu große Werte werden auf die angrenzenden Monate umgerechnet.

Rückgabewert

Typ
number
Beschreibung
Der neue Zeitstempel in Millisekunden seit dem 1.1.1970 00:00:00 UTC. Ist das Ergebnis ungültig, zum Beispiel weil monthValue NaN ist oder das Datum schon vorher ungültig war, ist der Rückgabewert NaN und das Datum ist danach ein Invalid Date.

Beispiele

Monat setzen und Überlauf ins nächste Jahr

const d = new Date(2024, 4, 15); // 15. Mai 2024

d.setMonth(11); // Dezember
console.log(d.toLocaleDateString('de-DE'));

d.setMonth(12); // Monat 12 = Januar des Folgejahres
console.log(d.toLocaleDateString('de-DE'));

d.setMonth(-1); // Monat -1 = Dezember des Vorjahres
console.log(d.toLocaleDateString('de-DE'));
15.12.2024 15.1.2025 15.12.2024

Fallstrick: Monatsende läuft über

const d = new Date(2024, 0, 31); // 31. Januar 2024
d.setMonth(1); // Februar – aber einen 31. Februar gibt es nicht

console.log(d.toLocaleDateString('de-DE'));
2.3.2024

Monate sicher addieren (Tag auf das Monatsende begrenzen)

const addMonths = (date, n) => {
  const d = new Date(date);
  const day = d.getDate();
  d.setDate(1);                     // Überlauf vermeiden
  d.setMonth(d.getMonth() + n);
  // letzter Tag des Zielmonats
  const lastDay = new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();
  d.setDate(Math.min(day, lastDay));
  return d;
};

console.log(addMonths(new Date(2024, 0, 31), 1).toLocaleDateString('de-DE'));
console.log(addMonths(new Date(2024, 7, 31), -2).toLocaleDateString('de-DE'));
29.2.2024 30.6.2024

Letzten Tag eines Monats mit dateValue = 0 bestimmen

const lastDayOfMonth = (year, month) => {
  const d = new Date(year, 0, 1);
  d.setFullYear(year);
  d.setMonth(month + 1, 0); // Tag 0 des Folgemonats = letzter Tag von month
  return d.getDate();
};

console.log(lastDayOfMonth(2023, 1)); // Februar 2023
console.log(lastDayOfMonth(2024, 1)); // Februar 2024 (Schaltjahr)
console.log(lastDayOfMonth(2024, 3)); // April
28 29 30

// Wichtig · Fallstricke

  • Monate beginnen bei 0: setMonth(12) ist kein Dezember, sondern der Januar des Folgejahres. Das ist eine häufige Fehlerquelle bei Monatswerten aus Formularen oder APIs, die bei 1 beginnen.
  • Überlauf am Monatsende: Am 29. bis 31. eines Monats kann setMonth() in den übernächsten Monat springen. Setzen Sie vorher den Tag auf 1 oder begrenzen Sie ihn danach auf das Monatsende (siehe Beispiel).
  • Das Objekt wird verändert: Die Methode ändert das bestehende Objekt. Wenn das Original erhalten bleiben soll, kopieren Sie es vorher mit new Date(original).
  • Ortszeit und Sommerzeit: Die Methode rechnet in der lokalen Zeitzone. Beim Wechsel über eine Sommerzeitgrenze bleibt die Uhrzeit (Wanduhrzeit) gleich, der Abstand in Millisekunden ist aber nicht immer ein Vielfaches von 24 Stunden. Für eine zeitzonenunabhängige Berechnung gibt es setUTCMonth().
  • Ungültige Werte: Nicht-numerische Argumente werden in Zahlen umgewandelt. Wird daraus NaN, ist das Datum danach ungültig (Invalid Date).
  • In allen Browsern und in Node.js unterstützt. Für neuen Code bietet sich künftig die Temporal-API an (Temporal.PlainDate.prototype.add({ months: 1 })). Sie begrenzt den Tag standardmäßig selbst auf das Monatsende, ist aber noch nicht überall verfügbar.