JavaScript für ungeduldige Programmierer (ES2022-Ausgabe)
Bitte unterstützen Sie dieses Buch: kaufen Sie es oder spenden Sie
(Werbung, bitte nicht blockieren.)

44 Daten (Date)



Dieses Kapitel beschreibt die JavaScript-API zur Arbeit mit Daten – die Klasse Date.

44.1 Best practice: Verwenden Sie nicht das eingebaute Date

Die JavaScript Date-API ist umständlich zu verwenden. Daher ist es am besten, sich für alles, was mit Daten zu tun hat, auf eine Bibliothek zu verlassen. Beliebte Bibliotheken sind

Konsultieren Sie den Blogbeitrag „Why you shouldn’t use Moment.js…“ für die Vor- und Nachteile dieser Bibliotheken.

Darüber hinaus arbeitet TC39 an einer neuen Datums-API für JavaScript: temporal.

44.1.1 Worauf Sie bei einer Datumsbibliothek achten sollten

Zwei Dinge sind wichtig zu beachten

44.2 Zeitstandards

44.2.1 Hintergrund: UTC vs. Z vs. GMT

UTC, Z und GMT sind sich ähnelnde, aber subtil unterschiedliche Möglichkeiten, die Zeit anzugeben

Quellen

44.2.2 Daten unterstützen keine Zeitzonen

Daten unterstützen die folgenden Zeitstandards

Je nach Operation sind nur einige dieser Optionen verfügbar. Beispielsweise können Sie beim Konvertieren von Daten in Zeichenketten oder beim Extrahieren von Zeiteinheiten wie dem Tag des Monats nur zwischen der lokalen Zeitzone und UTC wählen.

Intern werden Daten als UTC gespeichert. Bei der Konvertierung von oder in die lokale Zeitzone werden die notwendigen Verschiebungen über das Datum ermittelt. Im folgenden Beispiel ist die lokale Zeitzone Europa/Paris

// CEST (Central European Summer Time)
assert.equal(
  new Date('2122-06-29').getTimezoneOffset(), -120);
  
// CET (Central European Time)
assert.equal(
  new Date('2122-12-29').getTimezoneOffset(), -60);

Bei jeder Erstellung oder Konvertierung von Daten müssen Sie den verwendeten Zeitstandard beachten – zum Beispiel: new Date() verwendet die lokale Zeitzone, während .toISOString() UTC verwendet.

> new Date(2077, 0, 27).toISOString()
'2077-01-26T23:00:00.000Z'

Daten interpretieren 0 als Januar. Der Tag des Monats ist 27 in der lokalen Zeitzone, aber 26 in UTC.

  Dokumentation der von jeder Operation unterstützten Zeitstandards

Im Rest dieses Kapitels werden die unterstützten Zeitstandards für jede Operation angegeben.

44.2.2.1 Die Nachteile der fehlenden Möglichkeit, Zeitzonen anzugeben

Die Unfähigkeit, Zeitzonen anzugeben, hat zwei Nachteile

44.3 Hintergrund: Datums-/Zeitformate (ISO)

Datums-/Zeitformate beschreiben

Das Folgende ist ein Beispiel für eine von .toISOString() zurückgegebene Datums-/Zeichenkette

'2033-05-28T15:59:59.123Z'

Datums-/Zeitformate haben die folgenden Strukturen

Anstelle von Z (das UTC+0 ist) können wir auch *Zeitverschiebungen* relativ zu UTC angeben

44.3.1 Tipp: Hängen Sie ein Z an, um das Parsen von Daten deterministisch zu gestalten

Wenn Sie ein Z an das Ende einer Zeichenkette anhängen, liefert das Parsen von Daten keine unterschiedlichen Ergebnisse an verschiedenen Orten

44.4 Zeitwerte

Ein *Zeitwert* repräsentiert ein Datum über die Anzahl der Millisekunden seit dem 1. Januar 1970 00:00:00 UTC.

Zeitwerte können zum Erstellen von Daten verwendet werden

const timeValue = 0;
assert.equal(
  new Date(timeValue).toISOString(),
  '1970-01-01T00:00:00.000Z');

Das Koerzieren eines Datums in eine Zahl gibt seinen Zeitwert zurück

> Number(new Date(123))
123

Vergleichsoperatoren koerzieren ihre Operanden zu Zahlen. Daher können Sie diese Operatoren zum Vergleichen von Daten verwenden

assert.equal(
  new Date('1972-05-03') < new Date('2001-12-23'), true);

// Internally:
assert.equal(73699200000 < 1009065600000, true);

44.4.1 Erstellen von Zeitwerten

Die folgenden Methoden erstellen Zeitwerte

44.4.2 Abrufen und Setzen von Zeitwerten

44.5 Erstellen von Daten

44.5.1 Erstellen von Daten aus Zahlen

new Date(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, milliseconds?: number) (lokale Zeitzone)

Zwei der Parameter bergen Fallstricke

Beispiel

> new Date(2077,0,27, 21,49).toISOString() // CET (UTC+1)
'2077-01-27T20:49:00.000Z'

Beachten Sie, dass die Eingabestunden (21) von den Ausgabestunden (20) abweichen. Die ersteren beziehen sich auf die lokale Zeitzone, die letzteren auf UTC.

44.5.2 Parsen von Daten aus Zeichenketten

new Date(dateTimeStr: string) (lokale Zeitzone, UTC, Zeitverschiebung)

Wenn am Ende ein Z steht, wird UTC verwendet

> new Date('2077-01-27T00:00Z').toISOString()
'2077-01-27T00:00:00.000Z'

Wenn am Ende kein Z oder keine Zeitverschiebung steht, wird die lokale Zeitzone verwendet

> new Date('2077-01-27T00:00').toISOString() // CET (UTC+1)
'2077-01-26T23:00:00.000Z'

Wenn eine Zeichenkette nur ein Datum enthält, wird sie als UTC interpretiert

> new Date('2077-01-27').toISOString()
'2077-01-27T00:00:00.000Z'

44.5.3 Andere Möglichkeiten, Daten zu erstellen

44.6 Getter und Setter

44.6.1 Getter und Setter für Zeiteinheiten

Daten haben Getter und Setter für Zeiteinheiten – zum Beispiel

Diese Getter und Setter entsprechen den folgenden Mustern

Dies sind die unterstützten Zeiteinheiten

Es gibt noch einen weiteren Getter, der nicht den oben genannten Mustern entspricht

44.7 Konvertieren von Daten in Zeichenketten

Beispiel-Datum

const d = new Date(0);

44.7.1 Zeichenketten mit Zeiten

44.7.2 Zeichenketten mit Daten

44.7.3 Zeichenketten mit Daten und Zeiten

44.7.4 Andere Methoden

Die folgenden drei Methoden gehören nicht wirklich zu ECMAScript, sondern zur ECMAScript-Internationalisierungs-API. Diese API bietet viele Funktionen zur Formatierung von Daten (einschließlich Unterstützung für Zeitzonen), aber nicht zum Parsen.

  Übung: Erstellen einer Datumszeichenkette

exercises/dates/create_date_string_test.mjs