Menu

JavaScript Date: Datum erstellen, formatieren, vergleichen

Wie das Date-Objekt in JavaScript wirklich funktioniert: Datumsangaben erzeugen, formatieren, rechnen, mit Zeitzonen umgehen – und die typischen Stolperfallen vermeiden.

Das Date-Objekt als ein Moment in der Zeit

Ein Date in JavaScript steht für einen einzelnen Zeitpunkt — intern ist das schlicht eine Zahl: die Millisekunden seit dem 1. Januar 1970 UTC (die sogenannte „Unix-Epoche"). Alles andere — Jahre, Monate, Tage, Zeitzonen, Formatierung — ist nur eine Sicht, die über dieser Zahl liegt.

index.js
Output
Click Run to see the output here.

now.getTime() liefert schlicht die Anzahl an Millisekunden. Alles, was ein Date kann – vergleichen, Tage addieren, formatieren – läuft letztlich darauf hinaus, diese Zahl zu manipulieren und anschließend neu zu interpretieren.

Behalte dieses Modell im Kopf. Ein Date ist nicht "14. März in Paris". Es ist ein universeller Zeitpunkt, der sich darstellen lässt als 14. März in Paris oder als 13. März in Los Angeles – je nachdem, durch welche Zeitzone du ihn betrachtest.

Date-Objekte erzeugen mit new Date

Es gibt vier gängige Wege, ein Date zu erstellen:

index.js
Output
Click Run to see the output here.

Zwei Dinge, die du dir merken solltest:

  • Der Teile-Konstruktor arbeitet mit 0-basierten Monaten. Die 2 steht also für März, Januar ist 0. Eine klassische Fehlerquelle für Off-by-One-Bugs — immerhin ist die API in sich konsistent, denn auch an allen anderen Stellen werden Monate ab 0 gezählt.
  • new Date("2026-03-14") (ohne Uhrzeit) wird als UTC-Mitternacht interpretiert. new Date("2026-03-14T09:30") (ohne Z) dagegen als lokale Zeit. Diese Asymmetrie ist eine klassische Stolperfalle.

Wenn du nur den aktuellen Zeitpunkt als Zahl brauchst, nimm lieber Date.now() — das spart dir die Objekt-Allokation:

index.js
Output
Click Run to see the output here.

Date.now() ist genau das richtige Werkzeug, wenn du verstrichene Zeit messen, Timeouts setzen oder sonst etwas bauen willst, das ohne Kalenderrechnerei auskommt.

Einzelne Bestandteile eines Datums auslesen

Sobald du ein Date in der Hand hast, kommst du mit Gettern an die einzelnen Bestandteile. Davon gibt es jeweils zwei Varianten: einmal für die lokale Zeit und einmal für UTC.

index.js
Output
Click Run to see the output here.

Die lokalen Varianten hängen davon ab, auf welchem Rechner der Code läuft. Sobald du Datumsangaben zwischen Nutzern und Servern speicherst oder vergleichst, solltest du dich bewusst für UTC entscheiden – sonst jagst du Phantom-Bugs. Faustregel: UTC-Getter für alles, was in eine Datenbank oder ein Log wandert, lokale Getter nur für das, was du gleich einem Menschen anzeigen willst.

Finger weg von getYear(). Das ist eine Alt-Methode, die Jahr - 1900 zurückgibt und nur aus Kompatibilitätsgründen existiert. Nimm immer getFullYear().

Datum formatieren für menschliche Leser

Vergiss date.toString(), wenn dir das Ergebnis wichtig ist – die Ausgabe hängt von Locale und JavaScript-Engine ab. Es gibt zwei Formatierer, die du wirklich kennen solltest.

Für einen standardisierten, maschinenlesbaren String nimmst du toISOString():

index.js
Output
Click Run to see the output here.

Genau dieses Format solltest du beim Loggen, beim Speichern in JSON oder beim Versenden über das Netzwerk verwenden. Es ist immer UTC und damit eindeutig.

Für eine Ausgabe, die Menschen lesen sollen, nimmst du Intl.DateTimeFormat oder die toLocale*-Methoden, die darauf aufbauen:

index.js
Output
Click Run to see the output here.

Intl.DateTimeFormat kümmert sich um Locales, Zeitzonen und jede denkbare Kombination von Feldern, die du brauchst. Greif lieber dazu, statt manuell ${year}-${month}-${day} zusammenzubauen – genau bei solchen String-Bastelarbeiten schleichen sich die berüchtigten Off-by-one-Fehler beim Monat ein.

Datumsvergleich in JavaScript

Zwei Date-Objekte, die denselben Zeitpunkt darstellen, sind nicht === gleich – === prüft die Objektidentität, nicht den Wert. Vergleiche stattdessen ihre Zeitstempel:

index.js
Output
Click Run to see the output here.

Bei Vergleichen kannst du die üblichen Vergleichsoperatoren direkt benutzen, weil JavaScript die Datumsobjekte automatisch in Zahlen umwandelt:

index.js
Output
Click Run to see the output here.

Die Subtraktion liefert dir die Differenz in Millisekunden. Für Tage teilst du das Ergebnis durch 1000 * 60 * 60 * 24. Schreib die Konstante beim ersten Mal ruhig aus – irgendwann erkennst du 86_400_000 sowieso auf den ersten Blick.

Rechnen mit Datum in JavaScript

Eine addDays-Methode gibt es nicht. Stattdessen nimmt man idiomatischerweise setDate, setMonth & Co. – die akzeptieren auch Werte außerhalb des gültigen Bereichs und rollen dann sauber in den nächsten Monat bzw. das nächste Jahr über:

index.js
Output
Click Run to see the output here.

Zwei Punkte, die es wert sind, hervorgehoben zu werden:

  • new Date(date) erzeugt eine Kopie des Datums. setDate verändert das Original – also immer zuerst kopieren, sonst fummelst du am Wert des Aufrufers herum.
  • Ein setDate(35) in einem Monat mit 31 Tagen rutscht automatisch in den Folgemonat. Gleiches gilt für setMonth(14) – das zählt das Jahr eins hoch. Das macht Datumsarithmetik deutlich entspannter, als sie auf den ersten Blick wirkt.

Für alles, was komplexer wird – Werktage, wiederkehrende Termine, Zeiträume mit sauberer Monatslogik – greif zu einer Bibliothek (date-fns, Luxon oder die kommende Temporal-API). Kalenderlogik über "ein paar Tage addieren" hinaus selbst zu bauen, ist eine Sackgasse mit Teergrube.

Realitätscheck: JavaScript Datum und Zeitzone

Zeitzonen sind die mit Abstand größte Fehlerquelle beim Umgang mit Datumswerten. Diese Regeln solltest du verinnerlichen:

  • Ein Date speichert intern einen UTC-Zeitpunkt. Die Zeitzone greift erst, wenn du einzelne Bestandteile ausliest oder formatierst.
  • Die Zeitzone, die getHours(), getDate() & Co. verwenden, ist immer die lokale Zeitzone der ausführenden Maschine. Server und Browser ticken hier häufig unterschiedlich.
  • new Date("2026-03-14") (nur Datum) wird als UTC geparst. new Date("2026-03-14T00:00") (mit Uhrzeit, ohne Zonenangabe) wird als lokale Zeit interpretiert. new Date(2026, 2, 14) (Einzelteile) ist ebenfalls lokal.
index.js
Output
Click Run to see the output here.

Wenn du für die Anzeige eine bestimmte Zeitzone brauchst, übergibst du die Option timeZone an Intl.DateTimeFormat:

index.js
Output
Click Run to see the output here.

Derselbe Zeitpunkt, zwei Darstellungen. Das Date-Objekt selbst hat sich nicht verändert.

Ein kleines praktisches Beispiel

Zum Abschluss packen wir das Ganze in eine Funktion, die ausgibt, wie lange ein Ereignis her ist:

index.js
Output
Click Run to see the output here.

Zeitstempel rein, lesbarer String raus. So sieht in 90 % aller realen Fälle der Umgang mit Datumswerten aus: zwei Zeitpunkte subtrahieren, durch eine Einheit teilen, runden, formatieren.

Das Wichtigste auf einen Blick

  • Ein Date ist ein UTC-Zeitpunkt. Zeitzonen kommen erst ins Spiel, wenn du das Datum ausliest oder formatierst.
  • Date.now() nimmst du für Zeitstempel, new Date() für die Arbeit mit Kalenderdaten.
  • toISOString() eignet sich für Speicherung und Logs, Intl.DateTimeFormat für die Anzeige beim Nutzer.
  • Zum Vergleichen getTime() oder </> verwenden. Niemals ===.
  • Monate sind 0-basiert. Und Vorsicht bei der Falle mit reinen Datums-Strings beim Parsen.
  • Für ernsthafte Datumsberechnungen lohnt sich eine Library.

Als Nächstes: URLs und Query-Strings

Datumswerte tauchen oft in URLs auf – etwa beim Filtern nach Zeiträumen oder wenn man einen Zeitstempel als Query-Parameter mitgibt. URLs von Hand zu parsen und zusammenzubauen ist genauso fehleranfällig wie das manuelle Formatieren von Datumswerten, und die Standardbibliothek bringt mit dem URL-Objekt eine saubere Lösung mit. Darum geht es im nächsten Kapitel.

Häufig gestellte Fragen

Wie bekomme ich das aktuelle Datum in JavaScript?

Einfach new Date() ohne Argumente aufrufen – das liefert ein Date-Objekt mit dem Zeitpunkt, zu dem der Konstruktor lief. Wenn du nur einen numerischen Zeitstempel brauchst (Millisekunden seit 1970), nimm Date.now(). Das ist schneller und legt kein komplettes Objekt an.

Wie vergleiche ich zwei Daten in JavaScript?

Immer über die Zeitstempel vergleichen, nicht die Date-Objekte direkt. a.getTime() < b.getTime() funktioniert, und a < b geht auch, weil < das Datum automatisch in eine Zahl umwandelt. a === b dagegen nicht – === prüft die Objektidentität, also sind zwei Date-Objekte mit dem gleichen Zeitpunkt nie strikt gleich.

Wie formatiere ich ein Datum in JavaScript?

Für alles, was Nutzer zu sehen bekommen: Intl.DateTimeFormat oder date.toLocaleDateString(). Die kümmern sich sauber um Locale und Zeitzone. Für maschinenlesbare Ausgaben ist date.toISOString() die richtige Wahl, das liefert einen Standard-String wie 2026-03-14T09:30:00.000Z. date.toString() solltest du zum Speichern nicht verwenden – das Format hängt von der Locale ab.

Warum ist mein Datum in JavaScript einen Tag daneben?

In der Regel ein Zeitzonen-Problem. new Date('2026-03-14') wird als UTC-Mitternacht geparst, aber date.getDate() gibt den Tag in der lokalen Zeitzone zurück – und das kann dann der Vortag sein. Nimm getUTCDate() für den Tag in UTC, oder konstruiere das Datum direkt mit new Date(year, month, day), das arbeitet von Anfang an mit Lokalzeit.

Lerne mit Coddy zu programmieren

LOS GEHT'S