- Die bestehende Unvollständigkeit und Inkonsistenz des
Date-Objekts in JavaScript wird aufgezeigt, und als Ersatz wird die Temporal API vorgestellt
Date arbeitet als veränderbares Objekt (mutable object) und weicht damit vom eigentlichen Datumsbegriff ab; zudem gibt es Parsing-Fehler und Grenzen bei der Zeitzonenverarbeitung als strukturelle Probleme
- Temporal bietet ein neues Modell zur Datums- und Zeitverarbeitung auf Basis von Unveränderlichkeit und umfasst fein aufgeteilte Klassen wie
PlainDate, ZonedDateTime und Duration
- Die Methoden von Temporal verändern bestehende Objekte nicht, sondern geben neue Objekte zurück, wodurch klare und sichere Chaining-Operationen möglich werden
- Temporal befindet sich derzeit in Standardisierungsstufe 3 (Stage 3) und wird in modernen Browsern wie Chrome und Firefox experimentell unterstützt
Probleme mit dem Date-Objekt in JavaScript
- Der
Date-Konstruktor sorgt mit uneinheitlichen Parsing-Regeln und nicht intuitiver Indizierung für Verwirrung
- Beispiel: Der Monat beginnt bei 0, während Tag und Jahr bei 1 beginnen
- Die Zeichenkette
"99" wird als Jahr 1999 interpretiert, "100" dagegen als Jahr 0100 — es fehlt also an Konsistenz
Date ist auf Zeit (time) zentriert und speichert intern einen Unix-Timestamp (in Millisekunden)
- Die Unterstützung für Zeitzonen (time zones) ist eingeschränkt; Sommerzeit (DST) oder nicht-gregorianische Kalender werden nicht erkannt
- Aufgrund dieser Grenzen ist die Abhängigkeit von großen Drittanbieter-Bibliotheken wie Moment.js oder date-fns verbreitet, was zu Leistungseinbußen führt
Konflikt zwischen Unveränderlichkeit und Referenzkonzept
- Primitive Werte in JavaScript sind unveränderlich und werden als Werte selbst gespeichert, während Objekte (objects) als Referenzen gespeichert und veränderbar sind
Date ist ein über einen Konstruktor (constructor) erzeugtes Objekt und daher veränderbar
- Beispiel: Bei Aufrufen von
setMonth() oder setDate() wird das Originalobjekt direkt verändert
- Dadurch kommt es zwischen Variablen, die auf dasselbe Objekt verweisen, zu unerwarteten Wertänderungen
- Beispiel: Wenn eine Funktion
today als Argument erhält und intern das Datum verändert, wird auch das ursprüngliche today verändert
Temporal: eine neue Datums- und Zeit-API
Temporal ist kein Konstruktor, sondern ein Namespace-Objekt (namespace object) mit einer Math ähnlichen Struktur
- Wichtige Bestandteile:
PlainDate, PlainDateTime, PlainTime, ZonedDateTime, Duration, Now usw.
Temporal.Now liefert den aktuellen Zeitpunkt in verschiedenen Formen zurück
plainDateISO() → Datum im ISO-Format
zonedDateTimeISO() → Zeitpunkt inklusive Zeitzone
- Temporal-Objekte bieten ein klar definiertes Methodensystem
- Mit
add({ days: 1 }), subtract({ years: 2 }) usw. lassen sich Operationen mit expliziten Einheiten ausführen
- Bestehende Objekte werden nicht verändert, stattdessen wird ein neues Objekt zurückgegeben, wodurch die Unveränderlichkeit erhalten bleibt
Funktionsweise und Vorteile von Temporal
- Temporal-Objekte sind weiterhin Objekte, folgen aber einem beabsichtigt unveränderlichen Nutzungsmuster
- Beispiel:
today.add({ days: 1 }) gibt ein neues Datumsobjekt zurück, während das ursprüngliche today unverändert bleibt
- Gegenüber
Date bietet Temporal eine knappere und klarere Syntax
- Anforderungen wie Angabe von Zeitzonen, Berechnung von Zeitspannen und Beibehaltung des ISO-Formats werden modern umgesetzt
- Mit Method Chaining über
add, subtract, since, until usw. lassen sich komplexe Datumsberechnungen kompakt ausdrücken
Stand der Standardisierung und Ausblick
Temporal hat Stufe 3 (Stage 3) des ECMAScript-Vorschlagsprozesses erreicht, ein Zustand, in dem Browser-Implementierungen empfohlen werden
- In Chrome und Firefox hat die experimentelle Unterstützung bereits begonnen; andere Browser sollen folgen
- Entwickler können sich schon jetzt durch Tests und Feedback an der Verbesserung der Spezifikation beteiligen
Date wird zwar weiterhin existieren, doch künftig dürfte sich Temporal als Standard für die Datumsverarbeitung etablieren
- Der Artikel schließt mit dem Hinweis, man hätte es „1995 ersetzen sollen, aber selbst jetzt ist Temporal.Now der richtige Zeitpunkt“
Noch keine Kommentare.