Start · Sprachen · JavaScript · Referenz · new Temporal.PlainMonthDay()

new Temporal.PlainMonthDay()

Methode

Erzeugt ein <code>Temporal.PlainMonthDay</code>-Objekt aus ISO-Monat und -Tag, also einen Kalendertag ohne Jahr, Uhrzeit und Zeitzone (z. B. Geburtstag, Jahrestag).

seit JavaScript ES2026 (Temporal); Firefox 139+, Chrome 144+, Safa Kategorie: method-property

Signatur

new Temporal.PlainMonthDay(month, day, calendar, referenceYear)

Beschreibung

Der Konstruktor Temporal.PlainMonthDay() erzeugt ein unveränderliches Objekt, das einen wiederkehrenden Kalendertag darstellt, etwa „24. Dezember“ oder „29. Februar“. Es hat kein Jahr, keine Uhrzeit und keine Zeitzone. Damit eignet es sich gut für Geburtstage, Feiertage mit festem Datum oder Jahrestage.

Die Argumente werden immer als ISO-8601-Werte gelesen. month und day sind also Monat und Tag im gregorianischen ISO-Kalender. Intern wird das Objekt mit einem Referenzjahr gespeichert. Standardmäßig ist das 1972, ein Schaltjahr, damit der 29. Februar gültig ist.

Der Konstruktor ist eine Low-Level-API und prüft streng: Liegt ein Wert außerhalb des gültigen Bereichs, wirft er einen RangeError und korrigiert nichts. Im Alltag ist oft Temporal.PlainMonthDay.from() die bessere Wahl. Diese Methode nimmt auch Strings ("12-24") und Objekte an, kennt die Option overflow und versteht Monatsangaben aus Nicht-ISO-Kalendern richtig.

Parameter

Name Typ Default Beschreibung
$month Pflicht number ISO-Monat als ganze Zahl von 1 bis 12.
$day Pflicht number ISO-Tag als ganze Zahl von 1 bis zur Anzahl der Tage dieses Monats im Referenzjahr.
$calendar string "iso8601" Kalender-Kennung, z. B. "iso8601", "gregory" oder "hebrew". Groß- und Kleinschreibung spielt keine Rolle.
$referenceYear number 1972 ISO-Jahr, mit dem das Objekt intern gespeichert wird. Es ist vor allem bei Nicht-ISO-Kalendern wichtig, damit Monat und Tag eindeutig sind. Muss zusammen mit month und day ein gültiges ISO-Datum ergeben.

Rückgabewert

Typ
Temporal.PlainMonthDay
Beschreibung
Ein neues, unveränderliches Temporal.PlainMonthDay-Objekt. Wirft einen RangeError bei ungültigen Werten und einen TypeError, wenn der Konstruktor ohne new aufgerufen wird.

Beispiele

Einfachen Jahrestag anlegen

const heiligabend = new Temporal.PlainMonthDay(12, 24);

console.log(heiligabend.toString());
console.log(heiligabend.monthCode, heiligabend.day);
console.log(heiligabend.equals(Temporal.PlainMonthDay.from("12-24")));
12-24 M12 24 true

Geburtstag in einem bestimmten Jahr berechnen (inkl. 29. Februar)

// 1972 ist das Referenzjahr und ein Schaltjahr, daher ist der 29.02. gültig
const geburtstag = new Temporal.PlainMonthDay(2, 29);

// In Nicht-Schaltjahren wird automatisch auf den 28.02. angepasst
console.log(geburtstag.toPlainDate({ year: 2024 }).toString());
console.log(geburtstag.toPlainDate({ year: 2025 }).toString());
2024-02-29 2025-02-28

Tage bis zum nächsten Geburtstag

const tageBisGeburtstag = (monat, tag) => {
  const heute = Temporal.Now.plainDateISO();
  const md = new Temporal.PlainMonthDay(monat, tag);
  let naechster = md.toPlainDate({ year: heute.year });
  if (Temporal.PlainDate.compare(naechster, heute) < 0) {
    naechster = md.toPlainDate({ year: heute.year + 1 });
  }
  return heute.until(naechster).days;
};

console.log(`Noch ${tageBisGeburtstag(7, 15)} Tage bis zum Geburtstag`);
Noch … Tage bis zum Geburtstag (abhängig vom heutigen Datum)

Ungültige Werte abfangen

try {
  new Temporal.PlainMonthDay(2, 30);
} catch (err) {
  console.log(err.name);
}

// from() kann stattdessen tolerant korrigieren
const korrigiert = Temporal.PlainMonthDay.from({ month: 2, day: 30 }, { overflow: "constrain" });
console.log(korrigiert.toString());
RangeError 02-29

// Wichtig · Fallstricke

  • Browser-Unterstützung: Temporal ist neu: Firefox ab 139, Chrome/Edge ab 144, in Safari noch nicht verfügbar. Für Produktivcode brauchst du bei Bedarf einen Polyfill wie @js-temporal/polyfill oder temporal-polyfill.
  • Nur ISO-Werte: month und day sind immer ISO-Monat und ISO-Tag, auch wenn du einen anderen calendar angibst. Wenn du Monat und Tag in einem Nicht-ISO-Kalender angeben willst, etwa im hebräischen Kalender, nimm Temporal.PlainMonthDay.from({ monthCode, day, calendar }).
  • Kein Overflow-Verhalten: Der Konstruktor wirft bei ungültigen Werten wie (4, 31) immer einen RangeError. Nur from() kann mit overflow: "constrain" Werte anpassen.
  • Referenzjahr: Das Referenzjahr (Standard 1972) ist ein internes Detail und kein echtes Jahr. Es fließt nicht in equals()-Vergleiche im ISO-Kalender ein. Bei Nicht-ISO-Kalendern erscheint es aber in toString(), z. B. "1972-12-24[u-ca=gregory]".
  • Kein compare(): PlainMonthDay hat keine statische Methode compare(), weil die Reihenfolge ohne Jahr je nach Kalender nicht eindeutig ist. Zum Sortieren wandelst du die Werte vorher mit toPlainDate() um.
  • Ohne new aufgerufen, wirft der Konstruktor einen TypeError.