Signatur
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
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")));
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());
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`);
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());
// 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/polyfillodertemporal-polyfill. - Nur ISO-Werte:
monthunddaysind immer ISO-Monat und ISO-Tag, auch wenn du einen anderencalendarangibst. Wenn du Monat und Tag in einem Nicht-ISO-Kalender angeben willst, etwa im hebräischen Kalender, nimmTemporal.PlainMonthDay.from({ monthCode, day, calendar }). - Kein Overflow-Verhalten: Der Konstruktor wirft bei ungültigen Werten wie
(4, 31)immer einenRangeError. Nurfrom()kann mitoverflow: "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 intoString(), z. B."1972-12-24[u-ca=gregory]". - Kein
compare():PlainMonthDayhat keine statische Methodecompare(), weil die Reihenfolge ohne Jahr je nach Kalender nicht eindeutig ist. Zum Sortieren wandelst du die Werte vorher mittoPlainDate()um. - Ohne
newaufgerufen, wirft der Konstruktor einenTypeError.