Signatur
Beschreibung
setDate() ändert den Tag des Monats (1–31) eines bestehenden Date-Objekts, und zwar in der lokalen Zeitzone. Jahr, Monat und Uhrzeit bleiben erhalten, solange der neue Wert in den aktuellen Monat passt. Die Methode ändert das Objekt direkt (sie mutiert es) und gibt den neuen Zeitstempel zurück.
Besonders praktisch: Werte außerhalb des gültigen Bereichs werden automatisch übertragen. setDate(0) ergibt den letzten Tag des Vormonats, setDate(32) springt in den Folgemonat, negative Werte zählen rückwärts ab dem Vormonat. Deshalb ist date.setDate(date.getDate() + n) der übliche Weg, um Tage zu addieren oder abzuziehen, auch über Monats- und Jahresgrenzen hinweg.
Da die Rechnung in Kalendertagen der lokalen Zeit erfolgt, bleibt die Uhrzeit auch über eine Sommerzeitumstellung hinweg gleich. Das ist anders als beim Addieren von 86400000 Millisekunden. Wer in UTC rechnen will, nimmt setUTCDate().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $dateValue Pflicht | number | Ganzzahl für den Tag des Monats. Werte außerhalb von 1–31 werden in benachbarte Monate übertragen (0 = letzter Tag des Vormonats). Nicht-ganzzahlige Werte werden abgeschnitten, NaN macht das Datum ungültig. |
Rückgabewert
NaN zurückgegeben und das Datum wird zu Invalid Date.Beispiele
Tag des Monats direkt setzen
const termin = new Date(2024, 2, 10, 14, 30); // 10. März 2024, 14:30
termin.setDate(25);
console.log(termin.toLocaleString('de-DE'));
Tage addieren – auch über Monats- und Jahresgrenzen
const addDays = (date, days) => {
const result = new Date(date); // Kopie, Original bleibt unverändert
result.setDate(result.getDate() + days);
return result;
};
const start = new Date(2024, 11, 28); // 28. Dezember 2024
console.log(addDays(start, 7).toLocaleDateString('de-DE'));
console.log(addDays(start, -30).toLocaleDateString('de-DE'));
Anzahl der Tage eines Monats mit setDate(0)
const daysInMonth = (year, month) => {
// month: 0 = Januar; Tag 0 des Folgemonats = letzter Tag des Monats
const d = new Date(year, month + 1, 1);
d.setDate(0);
return d.getDate();
};
console.log(daysInMonth(2024, 1)); // Februar im Schaltjahr
console.log(daysInMonth(2023, 1));
console.log(daysInMonth(2024, 3)); // April
Rückgabewert und ungültige Eingaben
const d = new Date(2024, 0, 15);
const ts = d.setDate(20);
console.log(ts === d.getTime());
const kaputt = new Date(2024, 0, 15);
console.log(kaputt.setDate('abc'));
console.log(String(kaputt));
// Wichtig · Fallstricke
- Mutation:
setDate()ändert das ursprüngliche Objekt. Wenn ein Datum an mehreren Stellen verwendet wird, vorher mitnew Date(original)kopieren, sonst entstehen schwer auffindbare Fehler. - Monatsende-Falle: Wer erst den Monat und dann den Tag setzt, kann ungewollt übertragen: Am 31. Januar ergibt
setMonth(1)den 2. oder 3. März, bevorsetDate()überhaupt greift. Bessernew Date(jahr, monat, tag)verwenden oder zuerst den Tag auf 1 setzen. - Lokale Zeit vs. UTC: Wurde das Datum aus einem ISO-String wie
"2024-03-10"erzeugt, gilt es als UTC-Mitternacht. In Zeitzonen westlich von UTC kanngetDate()/setDate()dann einen Tag daneben liegen. Für reine UTC-RechnungensetUTCDate()nehmen. - Sommerzeit:
setDate(getDate() + 1)behält die lokale Uhrzeit bei. Das Addieren von 24 Stunden in Millisekunden tut das an Umstellungstagen nicht. - Nur ein Parameter: Anders als
setMonth()odersetHours()nimmtsetDate()keine weiteren Argumente an. - Die neue Temporal-API (
Temporal.PlainDate.prototype.add()) bietet unveränderliche Datumsobjekte, wird aber noch nicht von allen Browsern unterstützt.