Start · Sprachen · JavaScript · Referenz · Temporal.PlainYearMonth.prototype.toJSON()

Temporal.PlainYearMonth.prototype.toJSON()

Methode

Gibt den Jahr-Monat als Zeichenkette im RFC-9557-Format zurück (z. B. <code>"2024-03"</code>), also genau so wie <code>toString()</code> ohne Optionen.

seit JavaScript Temporal (ES-Proposal Stage 3) – Firefox 139+, Chr Kategorie: method-property

Signatur

Temporal.PlainYearMonth.prototype.toJSON()

Beschreibung

toJSON() sorgt dafür, dass sich ein Temporal.PlainYearMonth sinnvoll mit JSON speichern lässt. JSON.stringify() ruft die Methode automatisch auf, wenn ein solches Objekt in den Daten steckt. Heraus kommt die gleiche Zeichenkette wie bei toString() ohne Argumente. Beim ISO-8601-Kalender ist das die Form JJJJ-MM, zum Beispiel "2024-03".

Normalerweise ruft man die Methode nicht selbst auf. Sie wirkt im Hintergrund, wenn man Monatswerte an eine API schickt, im localStorage ablegt oder in Log-Dateien schreibt. Typische Monatswerte sind Abrechnungszeiträume, Ablaufdaten von Kreditkarten oder Berichtsmonate. Wenn du die Ausgabe steuern willst, etwa die Kalender-Angabe erzwingen, nimm stattdessen toString(options).

Bei einem anderen Kalender als iso8601 reicht JJJJ-MM nicht aus. Dann enthält die Ausgabe zusätzlich den Referenz-Tag im ISO-Kalender und eine Kalender-Angabe, zum Beispiel "2024-03-11[u-ca=hebrew]". Nur so lässt sich der Wert später eindeutig wiederherstellen.

Das Zurückverwandeln passiert nicht von selbst: JSON.parse() liefert nur eine Zeichenkette zurück. Um wieder ein Temporal.PlainYearMonth zu bekommen, wandelst du diese Zeichenkette mit Temporal.PlainYearMonth.from() um, zum Beispiel in einer Reviver-Funktion.

Rückgabewert

Typ
string
Beschreibung
Eine Zeichenkette im RFC-9557-/ISO-8601-Format, die mit toString() übereinstimmt, z. B. "2024-03". Bei einem Kalender außer ISO kommen der Referenz-Tag und [u-ca=…] dazu.

Beispiele

Direkter Aufruf

const monat = Temporal.PlainYearMonth.from({ year: 2024, month: 3 });

console.log(monat.toJSON());
console.log(monat.toJSON() === monat.toString());
2024-03 true

Automatisch über JSON.stringify()

const rechnung = {
  nummer: 'R-2024-0815',
  zeitraum: Temporal.PlainYearMonth.from('2024-11'),
  karteGueltigBis: new Temporal.PlainYearMonth(2027, 8)
};

// JSON.stringify ruft toJSON() für jedes Temporal-Objekt auf
console.log(JSON.stringify(rechnung));
{"nummer":"R-2024-0815","zeitraum":"2024-11","karteGueltigBis":"2027-08"}

Mit Reviver wieder in ein PlainYearMonth umwandeln

const json = '{"nummer":"R-2024-0815","zeitraum":"2024-11"}';

const daten = JSON.parse(json, (key, value) =>
  key === 'zeitraum' ? Temporal.PlainYearMonth.from(value) : value
);

console.log(daten.zeitraum instanceof Temporal.PlainYearMonth);
console.log(daten.zeitraum.daysInMonth);
true 30

Kalender außer ISO: Ausgabe mit Kalender-Angabe

const hebr = Temporal.PlainYearMonth.from({
  calendar: 'hebrew',
  year: 5784,
  month: 7
});

// Enthält den ISO-Referenz-Tag und die Kalender-Angabe
console.log(hebr.toJSON());
z. B. "2024-03-11[u-ca=hebrew]" (der genaue Referenz-Tag hängt vom Kalender ab)

// Wichtig · Fallstricke

  • Keine automatische Rückwandlung: JSON.parse() gibt nur eine Zeichenkette zurück. Zum Umwandeln brauchst du Temporal.PlainYearMonth.from(), zum Beispiel in einem Reviver.
  • Keine Optionen: toJSON() nimmt keine Argumente an. Um die Ausgabe zu steuern (z. B. calendarName: 'always'), nimm toString(options).
  • Nicht zur Anzeige gedacht: Das Format ist maschinenlesbar. Für Texte an Nutzer nimm toLocaleString() oder Intl.DateTimeFormat.
  • Nicht mit Zeichenketten vergleichen: Das Vergleichen der JSON-Zeichenketten klappt nur beim ISO-Kalender und bei Jahren von 0000 bis 9999 verlässlich. Jahre außerhalb davon erscheinen im erweiterten Format, z. B. "+012345-01" oder "-000001-01". Nimm besser Temporal.PlainYearMonth.compare() oder equals(). Vergleiche mit </> schlagen fehl, weil valueOf() einen TypeError wirft.
  • Kompatibilität: Temporal ist noch recht neu (Firefox 139+, Chrome 144+). In Safari und älteren Umgebungen brauchst du einen Polyfill, z. B. @js-temporal/polyfill oder temporal-polyfill. Vorher solltest du mit typeof Temporal !== 'undefined' prüfen, ob Temporal vorhanden ist.