Die Methode Date.prototype.setMonth() setzt den 0-basierten Monatsindex eines Date-Objekts in der lokalen Zeitzone. Werte außerhalb von 0–11 führen zu einem automatischen Jahresüberlauf – das ist ideal für Monatsarithmetik wie „in 3 Monaten” oder „vor 6 Monaten”. Wie bei getMonth() muss auch hier die 0-basierte Zählung beachtet werden: Januar = 0, Dezember = 11. Optional kann der Tag des Monats im selben Aufruf gesetzt werden.
Funktionsweise
Da die Monate 0-basiert sind, entspricht setMonth(0) dem Januar und setMonth(11) dem Dezember. Bei Werten wie 12 oder -1 wird das Jahr automatisch entsprechend angepasst:
setMonth(13): +1 Jahr, Februar.setMonth(-1): -1 Jahr, Dezember.
Eine Stolperfalle ist die Behandlung von Tagesüberläufen: Wenn das aktuelle Datum z. B. der 31. März ist und setMonth(1) (Februar) gesetzt wird, normalisiert JavaScript zum 3. März – nicht zum 28. Februar. Das ist häufig nicht das gewünschte Verhalten. Wer eine sichere Variante braucht, sollte setMonth(monthValue, 1) mit anschließendem setDate() verwenden.
Syntax
date.setMonth(monthValue)
date.setMonth(monthValue, dayValue)monthValue Eine Ganzzahl von 0 (Januar) bis 11 (Dezember).
dayValue (Optional) Eine Ganzzahl von 1 bis 31, die den Tag des Monats angibt.
Rückgabewert
Die Anzahl der Millisekunden seit dem 1. Januar 1970 UTC nach der Aktualisierung.
Beispiele
Monat setzen
const date = new Date("2026-05-01");
date.setMonth(11);
console.log(date.toISOString().slice(0, 10));2026-12-01Jahresüberlauf
const date = new Date("2026-05-01");
date.setMonth(13);
console.log(date.toISOString().slice(0, 10));2027-02-01Monat und Tag in einem Aufruf
const date = new Date("2026-05-01");
date.setMonth(11, 24);
console.log(date.toISOString().slice(0, 10));2026-12-24Stolperfalle: Tagesüberlauf
Beim Wechsel auf einen kürzeren Monat normalisiert JavaScript automatisch.
const date = new Date("2026-03-31");
date.setMonth(1); // Februar 2026 hat nur 28 Tage
console.log(date.toISOString().slice(0, 10));2026-03-03Sichere Monatsnavigation auf den Monatsanfang
function setzeMonatsanfang(date, monthIndex) {
const result = new Date(date);
result.setDate(1);
result.setMonth(monthIndex);
return result;
}
console.log(setzeMonatsanfang(new Date("2026-03-31"), 1).toISOString().slice(0, 10));2026-02-01Hinweise & verwandte Methoden
- Für die UTC-Variante:
Date.prototype.setUTCMonth(). - Stolperfalle: Beim Wechsel von einem 31-Tage- in einen 28/29/30-Tage-Monat normalisiert JavaScript automatisch in den Folgemonat. Wer das vermeiden will, sollte zuerst
setDate(1)setzen. - Die 0-basierte Zählung führt regelmäßig zu Off-by-One-Bugs – Code-Reviews lohnen sich.
- Die Methode mutiert das Original.