Herzlich willkommen zum SELF-Treffen 2026
vom 24.04. – 26.04.2026 in Halle (Saale)

Temporal/Stringdarstellung

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Dieser Artikel beschreibt die Strings, die zur Erzeugung von Temporal-Objekten verwendet werden können, detailliert. Zu unterscheiden sind hier Strings für die Erzeugung von Objekten für Datum und/oder Zeit, und Strings für die Erzeugung eines Duration-Objekts.

Datum und Zeit

Datumsangaben in diesen Strings verwenden immer den proleptischen gregorianischen Kalender, auch wenn das Objekt einen anderen Kalender nutzen soll. Der gregorianische Kalender ist der weltweit am häufigsten verwendete Kalender, und proleptisch bedeutet, dass die Regeln dieses Kalenders auch für Datumsangaben angewendet werden, die vor 1583 liegen, dem ersten vollständigen Geltungs dieses Kalenders. Insbesondere fehlen die 10 Tage, die bei Einführung übersprungen wurden.

Der allgemeine Aufbau eines Temporal-Datum/Zeit Strings ist:

   datum 'T' zeit offset '[' zeitzone ']' '[u-ca=' kalender ']'

Was davon verpflichtend und was optional ist, hängt von der beabsichtigten Verwendung ab.

Datum

Das Datum besteht aus Jahr, Monat und Tag, in dieser Reihenfolge. Zwischen diesen Teilen kann optional ein ASCII-Bindestrichminus - (&#X2D) notiert werden.

Das Jahr kann vier- oder sechsstellig sein ‐ wenn nötig, mit führenden Nullen. Vierstellige Jahreszahlen können nicht negativ sein, sechsstellige Jahreszahlen müssen zur Unterscheidung mit einem + oder - als Vorzeichen versehen werden.

Der Monat ist zweistellig im Bereich 01 bis 12.

Der Tag ist zweistellig im Bereich 01 bis zur Anzahl der Tage im Monat.

Das Jahr oder der Tag können entfallen, wenn ein PlainYearMonth- oder PlainMonthDay-Objekt für den ISO-Kalender erzeugt werden sollen. Für alle anderen Kalender sind sie erforderlich.

Beispiele:

   2025-10-15
   +002364-09-28
   19950604

Uhrzeit

Die Uhrzeit besteht aus Stunden, Minuten und Sekunden, in dieser Reihenfolge. Zwischen diesen Teilen kann optional ein Doppelpunkt : (&#X3A) notiert werden.

Wenn du Datum und Uhrzeit in einem String angibst, muss dazwischen ein 'T', 't' oder eine Leerstelle gesetzt werden.

Stunden, Minuten und Sekunden müssen aus zwei Ziffern bestehen, d. h. einstellige Werte bekommen eine führende Null. Zeiten können auf Nanosekunden genau notiert werden, deshalb sind bei den Sekunden 1-9 Nachkommastellen möglich. Als Dezimaltrennzeichen kann ein Punkt oder Komma genutzt werden.

Die Angabe für Stunden muss im Bereich 0-23 liegen, die Minuten im Bereich 0-59, die Sekunden im Bereich 0-59.999999999.

Beispiele:

   12:00:00
   173015
   04:10:22.876554
   06:00
   T1030
   2026-02-10T17:13:10
   1989-11-09T18:58
Beachte: Einige Zeitangaben können bei der Konstruktion von PlainTime-Objekten zu unerwarteten Überraschungen führen. Versucht man, ein PlainTime-Objekt aus "1030" zu konstruieren, wird ein RangeError geworfen mit der Meldung, dass dies eine Zeit oder eine Monat+Tag-Angabe sein könnte. Folgerichtig gibt es mit "1032" keine Probleme. Mit einem vorangestellten "T" ist klar, dass dies kein Datum ist und die Konstruktion gelingt.

Offset

Zur Angabe einer Zonenzeitverschiebung kann an die Uhrzeit der Zonenoffset angehängt werden. Dabei kann es sich um ein Z (oder z) handeln, um anzugeben, dass die Zeit in UTC angegeben ist, oder um eine Angabe in der Form +HH:MM oder -HH:MM. Es ist ein semantischer Unterschied, ob man Z oder +00:00 angibt! Z bedeutet UTC, +00:00 hingegen, dass dies eine Lokalzeit ist, deren Offset 00:00 ist.

Ein Offset wird nur von Instant und ZonedDateTime-Objekten beachtet. Bei Instant-Objekten ist der Offset Pflicht, für ZonedDateTime ist er optional, aber wenn er angegeben wird, muss er zur angegebenen Zeitzone passen. Die Plain-Objekte ignorieren die Angabe eines Offsets und werfen einen Fehler, wenn man Z angibt.

Beispiel:

   2001-09-11T08:46-04:00

Zeitzone

Real-World Datumsarithmetik funktioniert nur, wenn die dafür gültige Zeitzone bekannt ist. Sie kann entweder als (veraltetes) Kürzel wie "CET" (Central European Time) oder GMT angegeben werden, oder in der aktuellen IANA Schreibweise "Europe/Berlin". Das ist nicht ganz trivial, die IANA Zeitzonenliste ist riesig und voller obskurer Ausnahmen. Aber nur mit der richtigen Zonenangaben kann Temporal korrekt rechnen.[1]

Temporal unterstützt einige der alten Kürzel. CET oder EST (Eastern Standard Time, z. B. New York) werden verstanden, MSK (Moskau) hingegen nicht, dafür aber das uralte W-SU (Western Soviet Union). Vermeide diese Kürzel. Einige sind mehrdeutig und es hängt vom Browser ab, ob sie verstanden werden, und sie berücksichtigen regionale Besondernheiten nicht. CET wäre für die deutsche Exklave Büsingen beispielsweise im Jahr 1980 falsch, weil Deutschland 1980 Sommerzeit einführte, Büsingen aber der Schweiz gefolgt ist und erst 1981 die Sommerzeit einführte. Die Ermittlung der richtigen Zeitzone kann also kriminalistischen Aufwand erfordern.

In einem Temporal Datum/Zeit-String wird die Zeitzone in eckige Klammern gesetzt und hinter Uhrzeit und Offset notiert.

Beispiele:

   2022-02-24T05:58+03:00[Europe/Moscow]

Kalender

Standardmäßig verwenden Temporal-Objekte den ISO8601-Kalender und die String-Darstellung verlangt grundsätzlich, dass das Datum basierend auf diesem Kalender notiert wird. Du kannst aber (außer für Instant und PlainTime) angeben, dass Temporal andere Kalenderregeln für die Bildung von Tag, Monat und Jahr verwenden soll. Welche Kalender ein bestimmter Computer unterstützt, lässt sich mit Intl.supportedValuesOf('calendar') ermitteln.

Einem Temporal Datum/Zeit-String kann eine Kalenderangabe in der Form

   '[u-ca=' kalender-id ']'

hinzugefügt werden. Ohne diese Angabe wird der ISO8601-Kalender benutzt.

Non-ISO8601-Kalender können diverse Besonderheiten haben.

  • Solarkalender (z. B. der gregorianische Kalender) basieren auf der Erdumlaufdauer und ignorieren den Mond. Sie haben zumeist 12 Monate, mit unterschiedlicher Länge.
  • Lunarkalender (z. B. der islamische Kalender) basieren auf der Mondumlaufzeit. Sie haben ebenfalls 12 Monate, was dazu führt, dass jedes Jahr etwa 11 Tage zu kurz ist und der Jahresbeginn durch die Jahreszeiten wandert.
  • Lunisolarkalender (z. B. der chinesische oder jüdische Kalender) sind Lunarkalender mit eingefügten Schaltmonaten, die dafür sorgen, dass der Jahresbeginn und die Jahreszeiten grob zueinanderpassen.
  • Kalender können Ären haben, im gregorianischen Kalender beispielsweise BCE (before common era) und CE (common era)[2] oder im islamischen Kalender BH und AH (before/after Hidschra).

Um hierzu Informationen zu liefern, besitzen die Temporal-Objekte Eigenschaften wie era, daysInMonth, inLeapYear und weitere.

Um ein Temporal-Objekt mit nicht-ISO8601 Kalender auszugeben, muss man entweder manuell Tag, Monat und Jahr zusammensetzen, oder ein Locale verwenden, das diesen Kalender unterstützt. Versucht man beispielsweise das PlainDate "2026-02-27[u-ca=hebrew]" mit toLocaleString() auszugeben, scheitert das (in Deutschland) mit einem RangeError: MismatchedCalendars. Über toLocaleString("he-IL") gelingt es ebenfalls nicht, weil auch Israel den ISO8601-Kalender als Default verwendet. Hängt man dem Locale aber die Kalenderoption für den hebräischen Kalender an, gelingt es.

   console.log(Temporal.PlainDate
                 .from("2026-02-26[u-ca=hebrew])
                 .toLocaleString("he-IL-u-ca-hebrew"));
   > 10 באדר 5786


Ein solcher String kann als Eingabe für einen Instant verwendet werden. Für die Erzeugung von ZonedDateTime-Objekten sollte eher auf die Angabe einer Zeitzone zurückgegriffen werden.

Die Zeitzone ist entweder ein Zeitzonenkürzel wie CET (Central European Time) oder eine Ortsangabe wie Europe/Berlin. Sie wird in eckige Klammern gesetzt und folgt auf Uhrzeit und ggf. Zeitverschiebung. Gibt man eine Zeitverschiebung (außer Z) und eine Zeitzone an, prüft Temporal, ob die Verschiebung zur Zone passt. Lässt man die Verschiebung weg, wird sie bedarfsweise aus der Zonenangabe ermittelt.

Der Kalender wird ähnlich einer Locale-Kalenderergänzung (u-ca) notiert und ebenfalls in eckige Klammern gesetzt. Hinter u-ca folgt ein Gleichheitszeichen und die Kalender-ID.

Beispiel:

   2027-05-25T17:00:00[CET][u-ca=hebrew]

Die eigentliche Datums- und Zeitangabe erfolgt im ISO-Format, d.h. basierend auf dem gregorianischen Kalender. Wird aus diesem String ein ZonedDateTime-Objekt erstellt, würde man darin das Jahr 5787 vorfinden, den Monat 9 und den Tag 18.

Dauer

Temporal.Duration-Objekte können ebenfalls aus Strings erzeugt werden. Für diese Strings gibt es ein eigenes Format, das Dir vielleicht aus der PHP-Klasse DateInterval bekannt ist:

   ±P nY nM nW nD T nH nM nS

Die Leerstellen dienen nur der Lesbarkeit und dürfen nicht Teil des Strings sein.

Als Erweiterung zur ISO8601-Norm kann ein Duration-String auch eine negative Dauer angeben und deshalb optional mit einem + oder - beginnen.

Die Angabe des P (für Periode) ist Pflicht. Darauf folgen in dieser Reihenfolge Angaben für Jahre (Y), Monate (M), Wochen (W), Tage (D), ein T, dann Stunden (H), Minuten (M) und Sekunden (S).

Jeder Teilwert besteht aus einer nicht negativen Zahl und einem Buchstaben, der die Einheit für diese Zahl angibt. Die Teilwerte sind alle optional, es muss allerdings mindestens einer angegeben werden – notfalls mit dem Wert 0. Die Angabe des T hinter den Tagen ist Pflicht, wenn weitere Werte folgen, und andernfalls verboten.

Die Werte für den Datumsteil dürfen keine Nachkommastellen enthalten. Bei den Zeitangaben sind sie in der letzten notierten Komponenten zulässig, werden aber in die kleineren Einheiten umgerechnet. Als Dezimaltrennzeichen sind Punkt und Komma erlaubt.

In Durations ist die Angabe von Werten für Monat, Tag, Stunde, Minute oder Sekunde, die größer sind als die in Zeitpunktangaben üblichen Werte, erlaubt. Sie werden als solches gespeichert und nicht in die nächstgrößeren Einheiten umgerechnet, weil diese Umrechnung nur im Kontext eines Kalenders möglich ist.

Beispiele

string Bedeutung
P2Y 2 Jahre
P1Y2D Ein Monat und 2 Tage
P200D 200 Kalendertage
P2DT10H Ein Tag und 10 Stunden
PT5H10,5M 5 Stunden und 10,5 Minuten, gespeichert als 10 Minuten und 30 Sekunden!
Zwei Minuten, 5 Sekunden und 330 Millisekunden
Zwei Minuten, 5 Sekunden, 334 Millisekunden und 455 Mikrosekunden (sic!)

Referenzen

  1. Wikipedia: Liste der Zeitzonen der TZ-Datenbank (englisch, abgerufen 27.02.2026)
  2. Nein, nicht „Christian Era“. Das wäre falsch, das Christentum begann hierzulande erst mit Konstantin zu dominieren