Date)DateDieses Kapitel beschreibt die JavaScript-API zur Arbeit mit Daten – die Klasse Date.
DateDie 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.
Zwei Dinge sind wichtig zu beachten
Tree-shaking kann die Größe einer Bibliothek erheblich reduzieren. Es ist eine Technik, nur die Exporte einer Bibliothek auf einen Webserver zu deployen, die irgendwo importiert werden. Funktionen sind besser für Tree-shaking geeignet als Klassen.
Unterstützung für Zeitzonen: Wie später erklärt wird, unterstützt Date keine Zeitzonen, was eine Reihe von Fallstricken mit sich bringt und eine zentrale Schwäche darstellt. Stellen Sie sicher, dass Ihre Datumsbibliothek diese unterstützt.
UTC, Z und GMT sind sich ähnelnde, aber subtil unterschiedliche Möglichkeiten, die Zeit anzugeben
UTC (Coordinated Universal Time) ist der Zeitstandard, auf dem alle Zeitzonen basieren. Sie werden relativ dazu angegeben. Das bedeutet, dass kein Land oder Territorium UTC als seine lokale Zeitzone hat.
Z (Zulu Time Zone) ist eine militärische Zeitzone, die in der Luftfahrt und im Militär oft als anderer Name für UTC+0 verwendet wird.
GMT (Greenwich Mean Time) ist eine Zeitzone, die in einigen europäischen und afrikanischen Ländern verwendet wird. Sie ist UTC plus null Stunden und hat daher die gleiche Zeit wie UTC.
Quellen
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.
Die Unfähigkeit, Zeitzonen anzugeben, hat zwei Nachteile
Es ist unmöglich, mehrere Zeitzonen zu unterstützen.
Es kann zu standortspezifischen Fehlern führen. Zum Beispiel liefert das vorherige Beispiel je nach Ausführungsort unterschiedliche Ergebnisse. Um sicherzugehen
Z oder eine Zeitverschiebung beim Parsen von Zeichenketten (siehe nächster Abschnitt für weitere Informationen).Datums-/Zeitformate beschreiben
Date.parse()new Date()Date.prototype.toISOString()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
Datumsformate: Y=Jahr; M=Monat; D=Tag
YYYY-MM-DD
YYYY-MM
YYYYZeitformate: T=Trennzeichen (die Zeichenkette 'T'); H=Stunde; m=Minute; s=Sekunde und Millisekunde; Z=Zulu Time Zone (die Zeichenkette 'Z')
THH:mm:ss.sss
THH:mm:ss.sssZ
THH:mm:ss
THH:mm:ssZ
THH:mm
THH:mmZDatums-/Zeitformate: sind Datumsformate gefolgt von Zeitformaten.
YYYY-MM-DDTHH:mm:ss.sssZAnstelle von Z (das UTC+0 ist) können wir auch *Zeitverschiebungen* relativ zu UTC angeben
THH:mm+HH:mm (usw.)THH:mm-HH:mm (usw.)Z an, um das Parsen von Daten deterministisch zu gestaltenWenn Sie ein Z an das Ende einer Zeichenkette anhängen, liefert das Parsen von Daten keine unterschiedlichen Ergebnisse an verschiedenen Orten
Ohne Z: Eingabe ist der 27. Januar (in der Zeitzone Europa/Paris), Ausgabe ist der 26. Januar (in UTC).
> new Date('2077-01-27T00:00').toISOString()
'2077-01-26T23:00:00.000Z'Mit Z: Eingabe ist der 27. Januar, Ausgabe ist der 27. Januar.
> new Date('2077-01-27T00:00Z').toISOString()
'2077-01-27T00:00:00.000Z'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))
123Vergleichsoperatoren 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);Die folgenden Methoden erstellen Zeitwerte
Date.now(): number (UTC)
Gibt die aktuelle Zeit als Zeitwert zurück.
Date.parse(dateTimeStr: string): number (lokale Zeitzone, UTC, Zeitverschiebung)
Parst dateTimeStr und gibt den entsprechenden Zeitwert zurück.
Date.UTC(year, month, date?, hours?, minutes?, seconds?, milliseconds?): number (UTC)
Gibt den Zeitwert für das angegebene UTC-Datum und die angegebene UTC-Zeit zurück.
Date.prototype.getTime(): number (UTC)
Gibt den Zeitwert zurück, der dem Datum entspricht.
Date.prototype.setTime(timeValue) (UTC)
Setzt this auf das durch timeValue kodierte Datum.
new Date(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, milliseconds?: number) (lokale Zeitzone)
Zwei der Parameter bergen Fallstricke
Für month ist 0 Januar, 1 Februar usw.
Wenn 0 ≤ year ≤ 99, wird 1900 addiert
> new Date(12, 1, 22, 19, 11).getFullYear()
1912Deshalb vermeiden wir an anderer Stelle in diesem Kapitel die Zeiteinheit year und verwenden immer fullYear. Aber hier haben wir keine Wahl.
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.
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'new Date(timeValue: number) (UTC)
> new Date(0).toISOString()
'1970-01-01T00:00:00.000Z'new Date() (UTC)
Das Gleiche wie new Date(Date.now()).
Daten haben Getter und Setter für Zeiteinheiten – zum Beispiel
Date.prototype.getFullYear()Date.prototype.setFullYear(num)Diese Getter und Setter entsprechen den folgenden Mustern
Date.prototype.get«Unit»()Date.prototype.set«Unit»(num)Date.prototype.getUTC«Unit»()Date.prototype.setUTC«Unit»(num)Dies sind die unterstützten Zeiteinheiten
Volljähriges JahrMonat: Monat (0–11). **Fallstrick:** 0 ist Januar usw.Datum: Tag des Monats (1–31)Tag (nur Getter): Tag der Woche (0–6, 0 ist Sonntag)Stunden: Stunde (0–23)Minuten: Minuten (0–59)Sekunden: Sekunden (0–59)Millisekunden: Millisekunden (0–999)Es gibt noch einen weiteren Getter, der nicht den oben genannten Mustern entspricht
Date.prototype.getTimezoneOffset()
Gibt die Zeitdifferenz zwischen der lokalen Zeitzone und UTC in Minuten zurück. Zum Beispiel gibt es für Europa/Paris -120 (MESZ, Mitteleuropäische Sommerzeit) oder -60 (MEZ, Mitteleuropäische Zeit) zurück
> new Date('2122-06-29').getTimezoneOffset()
-120
> new Date('2122-12-29').getTimezoneOffset()
-60Beispiel-Datum
const d = new Date(0);Date.prototype.toTimeString() (lokale Zeitzone)
> d.toTimeString()
'01:00:00 GMT+0100 (Central European Standard Time)'Date.prototype.toDateString() (lokale Zeitzone)
> d.toDateString()
'Thu Jan 01 1970'Date.prototype.toString() (lokale Zeitzone)
> d.toString()
'Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)'Date.prototype.toUTCString() (UTC)
> d.toUTCString()
'Thu, 01 Jan 1970 00:00:00 GMT'Date.prototype.toISOString() (UTC)
> d.toISOString()
'1970-01-01T00:00:00.000Z'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.
Date.prototype.toLocaleTimeString()Date.prototype.toLocaleDateString()Date.prototype.toLocaleString() Übung: Erstellen einer Datumszeichenkette
exercises/dates/create_date_string_test.mjs