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

Date.prototype.setDate()

Methode

Setzt den Tag des Monats eines <code>Date</code>-Objekts in lokaler Zeit und gibt den neuen Zeitstempel in Millisekunden zurück.

seit JavaScript ES1 – Baseline: alle Browser Kategorie: method-property

Signatur

Date.prototype.setDate(dateValue)

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

Typ
number
Beschreibung
Der neue Zeitstempel in Millisekunden seit dem 1. Januar 1970 00:00:00 UTC. Ist das Ergebnis ungültig, wird 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'));
25.3.2024, 14:30:00

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'));
4.1.2025 28.11.2024

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
29 28 30

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));
true NaN Invalid Date

// Wichtig · Fallstricke

  • Mutation: setDate() ändert das ursprüngliche Objekt. Wenn ein Datum an mehreren Stellen verwendet wird, vorher mit new 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, bevor setDate() überhaupt greift. Besser new 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 kann getDate()/setDate() dann einen Tag daneben liegen. Für reine UTC-Rechnungen setUTCDate() 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() oder setHours() nimmt setDate() 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.