Start · Sprachen · JavaScript · Referenz · Temporal.PlainDateTime.prototype.with()

Temporal.PlainDateTime.prototype.with()

Methode

Gibt ein neues <code>Temporal.PlainDateTime</code> zurück, bei dem einzelne Datums- oder Uhrzeitfelder durch neue Werte ersetzt sind. Das Original bleibt unverändert.

seit JavaScript ES2026 (Temporal) – Firefox 139+, Chrome/Edge 144+ Kategorie: method-property

Signatur

Temporal.PlainDateTime.prototype.with(info, options)

Beschreibung

with() erzeugt eine Kopie eines Temporal.PlainDateTime, in der nur die angegebenen Felder geändert sind. Alle anderen Felder wie Jahr, Monat, Tag, Stunde oder Minute werden unverändert übernommen. Da Temporal-Objekte unveränderlich sind, ändert die Methode nie das ursprüngliche Objekt, sondern gibt immer eine neue Instanz zurück.

Die Methode eignet sich für absolute Änderungen wie „auf den 1. des Monats setzen“, „auf 9:00 Uhr setzen“ oder „auf den letzten Tag des Monats setzen“. Für relative Änderungen („3 Tage später“) sind add() und subtract() gedacht.

Die Felder werden im Kalender der Instanz ausgewertet. Den Kalender selbst kann with() nicht ändern, dafür gibt es withCalendar(). Um die komplette Uhrzeit zu ersetzen, ist withPlainTime() oft kürzer.

Mit der Option overflow legst du fest, was bei ungültigen Kombinationen wie dem 31. Februar passiert: Bei "constrain" (Standard) wird der Wert auf den nächsten gültigen Wert gekürzt, bei "reject" wird ein RangeError geworfen.

Parameter

Name Typ Default Beschreibung
$info Pflicht Object Objekt mit mindestens einem der Felder year, month, monthCode, day, era/eraYear (je nach Kalender), hour, minute, second, millisecond, microsecond, nanosecond. Die Felder calendar und timeZone sind nicht erlaubt.
$options Object undefined Optionales Einstellungsobjekt.
$options.overflow "constrain" | "reject" "constrain" Verhalten bei Werten außerhalb des gültigen Bereichs: "constrain" kürzt auf den nächsten gültigen Wert, "reject" wirft einen RangeError.

Rückgabewert

Typ
Temporal.PlainDateTime
Beschreibung
Ein neues Temporal.PlainDateTime mit den ersetzten Feldern. Das ursprüngliche Objekt bleibt unverändert.

Beispiele

Einzelne Felder ersetzen

const termin = Temporal.PlainDateTime.from("2025-07-06T15:30:00");

// Nur die Stunde ändern – Datum und Minuten bleiben
const morgens = termin.with({ hour: 9 });
console.log(morgens.toString());

// Mehrere Felder gleichzeitig ändern
const ersterDesMonats = termin.with({ day: 1, hour: 0, minute: 0 });
console.log(ersterDesMonats.toString());

// Das Original ist unverändert
console.log(termin.toString());
2025-07-06T09:30:00 2025-07-01T00:00:00 2025-07-06T15:30:00

Monatsende berechnen und auf Tagesbeginn setzen

const jetzt = Temporal.PlainDateTime.from("2024-02-10T14:45:12.5");

// Letzter Tag des Monats, 23:59:59
const monatsende = jetzt.with({
  day: jetzt.daysInMonth,
  hour: 23,
  minute: 59,
  second: 59,
  millisecond: 0
});
console.log(monatsende.toString());

// Beginn des Tages (Alternative: jetzt.withPlainTime())
const tagesbeginn = jetzt.with({
  hour: 0, minute: 0, second: 0,
  millisecond: 0, microsecond: 0, nanosecond: 0
});
console.log(tagesbeginn.toString());
2024-02-29T23:59:59 2024-02-10T00:00:00

Überlauf: constrain vs. reject

const dt = Temporal.PlainDateTime.from("2024-01-31T12:00");

// Standard "constrain": 31. Februar wird auf den 29. gekürzt (Schaltjahr)
console.log(dt.with({ month: 2 }).toString());

// "reject": ungültiges Datum führt zu einem Fehler
try {
  dt.with({ month: 2 }, { overflow: "reject" });
} catch (err) {
  console.log(err.constructor.name);
}
2024-02-29T12:00:00 RangeError

// Wichtig · Fallstricke

  • Keine relative Änderung: with({ day: dt.day + 40 }) läuft nicht in den nächsten Monat über. Mit "constrain" wird der Tag stillschweigend auf den Monatsletzten gekürzt. Für Rechnungen solltest du add()/subtract() verwenden.
  • Ein leeres Objekt oder ein Objekt ohne bekanntes Feld führt zu einem TypeError. Das gilt auch für Objekte mit calendar oder timeZone und für Temporal-Objekte als info.
  • month und monthCode dürfen nicht widersprüchlich sein. Sonst wird ein RangeError geworfen. In Kalendern mit Schaltmonaten (z. B. dem hebräischen) ist monthCode eindeutiger.
  • Unbekannte Felder werden stillschweigend ignoriert. Ein Tippfehler wie { hours: 9 } ändert also nichts und wirft nur dann einen Fehler, wenn sonst kein gültiges Feld enthalten ist.
  • Kompatibilität: Temporal ist erst in neueren Browsern verfügbar (Firefox 139+, Chrome/Edge 144+). Für Safari und ältere Umgebungen gibt es einen Polyfill, z. B. @js-temporal/polyfill oder temporal-polyfill.