Skip to content
industry insights

Die Date-Klasse von JavaScript ist fehlerhaft

Ihr Code verbirgt wahrscheinlich subtile datumsbezogene Fehler, die von Unit-Tests nicht erkannt werden. Der Grund dafür ist ein grundlegender Designfehler in JavaScripts gebräuchlichstem und verfluchtestem globalen Objekt.

Cassidy Wolfe
Die Date-Klasse von JavaScript ist fehlerhaft

Das „Null“-Paradoxon: Ein kaputter erster Eindruck

Die Date-Klasse von JavaScript ist grundlegend fehlerhaft, ein Relikt, das mehr Frustration als Nutzen erzeugt. Ein kurzes Quiz aus dem Video „How well do you know JavaScript's Date class?“ von Better Stack deckt diesen systemischen Fehler sofort auf. Fragt man new Date('0'), erhält man das Jahr 2000. new Date(0) hingegen gibt korrekt die Unix-Epoche zurück, den 1. Januar 1970, 00:00:00 UTC. Die Unterscheidung zwischen einem String und einer Zahl führt hier zu einem Unterschied von dreißig Jahren – ein wahrlich verwirrender erster Eindruck.

Die Verwirrung wird durch Date.parse() nur noch vertieft. Diese Methode arbeitet ausschließlich mit Strings, was bedeutet, dass Date.parse(0) die Zahl 0 zunächst in den String '0' umwandelt. Folglich liefern sowohl Date.parse('0') als auch Date.parse(0) das Jahr 2000. Die zugrunde liegende Logik, falls überhaupt vorhanden, bleibt im Dunkeln und zwingt Entwickler zu ständiger Wachsamkeit gegenüber unerwarteter Typumwandlung.

Die Absurdität geht über die Null hinaus. Betrachten Sie new Date('2'). Man könnte einen Fehler oder vielleicht die Epoche erwarten, aber JavaScript interpretiert dies als Februar 2001. Solch willkürliches Parsing entspringt dem, was nur als implementierungsspezifische Heuristiken bezeichnet werden kann, bei denen einstellige Strings mehrdeutig zu Jahren oder Monaten werden. Diese Unvorhersehbarkeit macht das Date-Objekt zu einem Minenfeld, nicht zu einem Werkzeug.

Ein Minenfeld aus Veränderlichkeit und Zeitzonen

Neben den Parsing-Eigenheiten birgt das Date-Objekt von JavaScript grundlegende Designfehler, die es zu einer ständigen Quelle der Frustration machen. Seine Veränderlichkeit (Mutability) ist ein Hauptübeltäter. Methoden wie setDate() oder setMonth() verändern die Date-Instanz direkt, was zu heimtückischen Nebeneffekten in einer Anwendung führt. Übergeben Sie ein Date-Objekt an eine Funktion, ändern Sie es, und plötzlich hat sich die ursprüngliche Referenz ohne explizite Warnung geändert, was zu Debugging-Albträumen führt.

Dann gibt es die berüchtigten Zeitzonenprobleme. Das Date-Objekt konvertiert aggressiv in und aus der lokalen Zeitzone des Benutzers, was zu allgegenwärtigen Off-by-one-day-Fehlern führt. Ein Datum, das aus einem UTC-String erstellt wurde, mag korrekt erscheinen, doch nachfolgende Aufrufe von getDate() oder getMonth() können einen völlig anderen Tag oder Monat zurückgeben, wenn der lokale Offset es über eine Mitternachtsgrenze verschiebt. Diese Mehrdeutigkeit zwischen lokaler Zeit und UTC ist eine ständige Falle.

Schließlich ist die API selbst ein Paradebeispiel für schlechtes Design. Monate sind nullbasiert (zero-indexed), was bedeutet, dass Januar 0 und Dezember 11 ist – eine klassische Fehlerquelle, die ständiges Kopfrechnen erfordert. Noch schlimmer: Das Date-Objekt behandelt ungültige Werte mit stillem „Überlauf“ statt mit Fehlern. Versuchen Sie new Date(2023, 0, 32): Anstatt eine Ausnahme für den 32. Januar auszulösen, springt es auf den 1. Februar 2023, maskiert fehlerhafte Daten und lässt inkorrekte Datumsangaben unbemerkt weiterbestehen.

Temporal: Die moderne Lösung, die wir verdienen

Die Herrschaft der Fehler des Date-Objekts endet endlich. Nach Jahrzehnten, in denen Entwickler gegen sein unberechenbares Verhalten ankämpften, ist JavaScripts offizieller, moderner Ersatz, Temporal, da, um den Schmerz zu lindern. Dies ist nicht nur ein Upgrade; es ist ein grundlegender Paradigmenwechsel, der sorgfältig entwickelt wurde, um die Kerndesignfehler zu beheben, die JavaScript seit seiner Entstehung geplagt haben.

Der wichtigste Vorteil von Temporal ist die Verwendung von immutable objects (unveränderlichen Objekten). Dieses Design verhindert die stillen, schwer zu debuggenden Nebenwirkungen, die bei dem veränderbaren Date-Objekt üblich sind, und stellt sicher, dass Operationen immer neue Instanzen zurückgeben, anstatt bestehende zu verändern. Darüber hinaus erhalten Entwickler endlich eine explizite, eindeutige Kontrolle über die Handhabung von Zeitzonen. Dies eliminiert das Rätselraten und die unerwarteten Konvertierungen, die Anwendungen, die nach globaler Genauigkeit streben, lange Zeit geplagt haben.

Über die Unveränderlichkeit hinaus führt Temporal eine leistungsstarke Suite präziser Objekttypen ein, die jeweils darauf ausgelegt sind, spezifische Zeitkonzepte genau abzubilden. Entwickler müssen nicht mehr jedes Datum-Zeit-Szenario in ein einziges, überladenes Date-Objekt zwängen. Temporal bietet dedizierte Typen wie:

  • Temporal.PlainDate für Daten ohne Zeit- oder Zeitzonenkontext.
  • Temporal.PlainTime für Uhrzeiten ohne Datums- oder Zeitzonenkontext.
  • Temporal.ZonedDateTime für einen bestimmten Zeitpunkt, der an eine Zeitzone und einen Kalender gebunden ist.

Diese spezialisierten Objekte bieten beispiellose Klarheit und Kontrolle, ein krasser Gegensatz zu den inhärenten Problemen des Legacy-Date-Objekts. Für eine weitere Untersuchung der berüchtigten Inkonsistenzen des Date-Objekts konsultieren Sie Date - JavaScript | MDN.

Gefällt Ihnen der Artikel? Erhalten Sie jeden Morgen einen wie diesen per E-Mail.

eine E-Mail pro Tag · Abmeldung mit zwei Klicks · kein Tracking durch Dritte

Wie Sie der Date-Falle heute entkommen

Entwickler, die Zeit für Ausreden ist vorbei. Obwohl Temporal ein Stage-3-Vorschlag bleibt, machen stabile Polyfills wie tc39/proposal-temporal es bereits heute vollständig produktionsreif. Sie müssen die robuste Datumsverarbeitung nicht länger aufschieben und auf die native Browser-Verbreitung warten. Nutzen Sie jetzt die Zukunft des JavaScript-Datums- und Zeitmanagements, um deutlich zuverlässigere Anwendungen zu erstellen.

Betrachten Sie die häufige, frustrierende Falle, einem Datum einen Monat hinzuzufügen. Das integrierte Date-Objekt von JavaScript mit seiner inhärenten Veränderbarkeit und den oft verwirrenden Kalender-Eigenheiten liefert häufig überraschende, falsche Ergebnisse. Der Versuch, zum 31. Januar 2023 einen Monat hinzuzufügen, indem man new Date(2023, 0, 31).setMonth(1) verwendet, verändert das Datumsobjekt katastrophalerweise auf den 2. März 2023, anstatt auf den erwarteten 28. oder 29. Februar. Temporal bietet im Gegensatz dazu Klarheit und Vorhersehbarkeit:

// Vorher: Fehlerhaftes Date
const d = new Date(2023, 0, 31);
d.setMonth(d.getMonth() + 1); // Ändert sich zu März 2, 2023

// Nachher: Sauberes Temporal
const plainDate = Temporal.PlainDate.from('2023-01-31');
const nextMonth = plainDate.add({ months: 1 }); // Korrekt Februar 28, 2023

Dieser krasse Unterschied unterstreicht das immutable Design und die vorhersehbare Arithmetik von Temporal. Die API handhabt Kalenderüberläufe und Zeitzonen konsistent ohne versteckte Fallstricke. Es ist an der Zeit, die Abhängigkeit von oft überdimensionierten Bibliotheken von Drittanbietern abzulegen, die lediglich native Mängel beheben und unnötige Bundle-Größe und Komplexität hinzufügen. Beginnen Sie damit, diesen offiziellen, zukünftigen Standard zu erlernen. Schreiben Sie eine Datumslogik, die wirklich lesbar, nachweislich weniger fehleranfällig und auf Langlebigkeit ausgelegt ist, und befreien Sie Ihre Codebasis von einem Jahrzehnt datumsbezogener Kopfschmerzen.

Häufig gestellte Fragen

Warum gibt new Date('0') in JavaScript das Jahr 2000 zurück?

Dies liegt an inkonsistenten, implementierungsspezifischen Parsing-Regeln in der JavaScript-Engine. Kurze, mehrdeutige Zeichenfolgen werden nicht gemäß einem klaren Standard behandelt, was zu unerwarteten Ergebnissen führt, wie etwa, dass '0' als das Jahr 2000 interpretiert wird.

Was ist die Temporal API?

Temporal ist eine moderne, integrierte JavaScript-API, die entwickelt wurde, um das fehlerhafte Date-Objekt vollständig zu ersetzen. Sie bietet unveränderliche Objekte, eine explizite Zeitzonenhandhabung und einen vorhersehbaren, robusten Satz an Werkzeugen für die Datums- und Zeitmanipulation.

Ist die Temporal API für den produktiven Einsatz bereit?

Als TC39 Stage 3 Proposal ist die Temporal API stabil, aber noch nicht nativ in allen Browsern verfügbar. Entwickler können sie heute über offizielle Polyfills nutzen, was es ihnen ermöglicht, zukunftssicheren Code zu schreiben und sofort von den Vorteilen zu profitieren.

Warum ist Temporal besser als Bibliotheken wie Day.js oder date-fns?

Während Bibliotheken wie Day.js exzellente Workarounds bieten, erhöhen sie die Bundle-Größe Ihrer Anwendung. Temporal wird eine native, standardisierte Lösung sein, die direkt in die JavaScript-Sprache integriert ist, eine bessere Performance bietet und die Notwendigkeit für Abhängigkeiten von Drittanbietern eliminiert.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only