Das Date-Objekt – Programmieren lernen mit JavaScript – Thytos
Nächstes Video startet in 3 Sekunden.
Programmieren lernen mit JavaScript

Das Date-Objekt

Computer messen Zeit an­ders als Men­schen. Statt mit Jah­ren, Mo­na­ten und Tag­en zu ar­bei­ten, zäh­len sie die Na­no­se­kun­den fort­lau­fend seit Ja­nuar 1970.

Um Zeiten und Daten in der Programmierung darzustellen, gibt es meist ein zweckbestimmtes Objekt oder eine Funktion oder eine andere dedizierte Form. In JavaScript ist das genauso: Dort gibt es das Date-Object, zu Deutsch: das Datums-Objekt.

Um ein eigenes Datumsobjekt zu erzeugen, wird mit dem new-Operator eine Instanz aus dem Date-Konstruktor erzeugt.

new Date();
// => Tue Jan 19 2038 04:14:07 GMT+0100 (CET)

Das neu erstellte Datumsobjekt beinhaltet eine Repräsentation vom Zeitpunkt, an dem es geschaffen wurde.
Wenn stattdessen das Datumsobjekt einen anderen Zeitpunkt repräsentieren soll, kann der gewünschte Zeitpunkt mit Parametern übergeben werden. Dabei geht es von großen Zeiteinheiten hin zu kleinen: Der erste Parameter ist das Jahr, der zweite der Monatsindex, der dritte der Tag, danach folgt die Uhrzeit mit Stunde, Minute, Sekunde und sogar Millisekunde.
Jeder Parameter ist optional. Wenn das Dateobjekt zum Beispiel keinen Zeitpunkt, sondern nur einen Tag repräsentieren soll, kann die Uhrzeit weggelassen werden; das Datumsobjekt beinhaltet dann den Zeitpunkt des übergebenen Tages um Mitternacht.

new Date(2019, 0, 1);
// => Tue Jan 01 2019 00:00:00 GMT+0100 (CET)

// Von groß nach klein:
new Date(Jahr, Monatsindex, Tag, Stunde, Minute, Sekunde, Millisekunde);

Wichtig ist: Der Monat wird als Index übergeben. Das bedeutet, dass bei Null begonnen wird, zu zählen. Januar ist Null, Dezember ist Elf.

Monatsindex Monat
0 Januar
1 Februar
2 März
3 April
4 Mai
5 Juni
6 Juli
7 August
8 September
9 Oktober
10 November
11 Dezember

Beispielfall: Bestimmtes Datum festlegen

Wenn ihr selbst ausprobieren wollt, ein Datumsobjekt zu schaffen, öffnet eure Browserkonsole, und versucht, den als Datum wiederzugeben.
Probiert euer Glück und lest erst weiter, wenn ihr es geschafft habt.

Wichtig bei der Lösung zu beachten, ist den Monat als Index zu schreiben. Da April der vierte Monat ist, hat er den Index 3. Die Stunden und Minuten bei der Uhrzeit können auf 0 gesetzt werden, müssen es aber nicht, weil das bereits der Standardwert ist.

new Date(2014, 3, 2, 12);
// => Wed Apr 02 2014 12:00:00 GMT+0200 (CEST)

// Das gleiche wie
new Date(2014, 3, 2, 12, 0, 0);

Datums-Methoden

Ein Datumsobjekt hat auch verschiedene Methoden. In der Konsole kann es eine Vorschau der Methoden geben, wenn ihr hinter einem Datumsobjekt einen Punkt tippt.

Nach dem Punkt wird eine ganze Liste an Properties angezeigt, die das Datumsobjekt besitzt

Die Liste enthält viele sogenannter Getter- und Setter-Methoden, mit denen Werte ausgelesen und gesetzt werden können. Beispielsweise gibt es Methoden zum Auslesen und Setzen des Jahres, des Tages oder der Stunde.

var dObj = new Date(2014, 3, 2, 12);

dObj.getDate(); // Der Tag im Monat
// => 2

dObj.getDay(); // Der Wochentagsindex
// => 3

Unter diesen Methoden ist auch getTime, also lese Zeit aus. Die Methode gibt eine sehr hohe Zahl zurück. Was hat es damit auf sich?

dObj.getTime();
// => 1396432800000

Wie misst ein Computer Zeit?

getTime gibt die Anzahl der Millisekunden zurück, die seit dem bis zu dem Zeitpunkt, den das Datumsobjekt beinhaltet, vergangen sind.

Wozu sollte das gebraucht werden? Die Zahl verrät viel darüber, wie ein Computer intern mit Zeit umgeht.
Denn Computer arbeiten nicht mit Tagen, Monaten und Jahren oder Stunden, Minuten und Sekunden. Computer zählen die Zeit.
Und der ist der Zeitpunkt, an dem in JavaScript der Computer beginnt, zu zählen. Das ist die nullte Millisekunde. Von dort aus wird jede Millisekunde gezählt, sodass die Anzahl der Millisekunden heutzutage inzwischen sehr hoch ist.

// Anzahl der Millisekunden vom 1.1.1970 bis jetzt
(new Date()).getTime();
// => 1499337749756

Wie zählt ein Computer Zeit? In jedem Computer steckt ein Quartz-Kristall. Quartz-Kristalle beginnen extrem gleichmäßig zu vibrieren, wenn sie unter Strom gesetzt werden. An den Quartzkristall wird ein Sensor angeschlossen, der die Frequenz der Vibration misst, indem er jede Schwingung zählt. Diese Zahl stellt die Grundlage der Zeitrechnung im Computer dar.

Der als Ausgangswert, um von da an die Zeit zu zählen, ist nicht nur in JavaScript so gegeben. Dieses Datum ist weit verbreitet über alle Programmiersprachen und Betriebssysteme hinweg und hat einen eigenen Namen:The Epoch, zu Deutsch: Die Epoche (spezifischer heißt es The POSIX epoch).

Die Wahl dieses Datums geht zurück auf eines der ersten Betriebssysteme, das damals entwickelt wurde, namens Unix, das für manche auch heute noch ein Begriff sein sollte.
Anfangs zählte die Unix-Uhr in Hundertstel Sekunden. Da die Speichergröße von Zahlen begrenzt ist und zum Speichern dieser Zahl damals eine 32-Bit Ganzzahl verwendet wurde, wurde die höchstmögliche Zahl schnell erreicht, sodass die Epoche jedes Jahr neu gesetzt werden musste. Um das längerfristig zu vermeiden, haben die Entwickler die Art der Zählung verändert und daraufhin den Anfang des damaligen Jahrzehnts als Startdatum festgelegt. Vermutlich hätten sie sich damals nicht denken können, dass das Datum, dass sie dort festlegten, noch so viele Jahrzehnte später das Datum wäre, auf das sich sämtliche technischen Geräte der Welt beziehen würden.
Und das ist auch der Grund, warum es in Zukunft zu einem Problem kommen könnte.

Das 2038-Problem

Um die Epoche nicht jedes Jahr neu festzulegen, haben sich die Entwickler überlegt, nicht in Hundertstel Sekunden zu zählen, sondern in Sekunden. Das ermöglichte, hundertmal mehr Zeit zählen zu können. Trotzdem: Die Art der Speicherung blieb gleich, sodass es weiterhin eine Begrenzung gab, also eine höchste Zahl, die erreicht werden konnte.

Zum Speichern nahmen sie eine vorzeichenbehaftete 32-Bit Ganzzahl. Das bedeutet, dass die höchstmögliche Zahl eine Null mit 31 Einsen ist.

01111111111111111111111111111111

Im Dezimalsystem entspricht das der Zahl 2 147 483 647. Nur so viele Sekunden können vom gezählt werden. Diese Zahl ist am erreicht.

Was dann passieren könnte, ist folgendes: Es könnte sein, dass der Computer die Binärzahl weiterzählt, sodass die erste Stelle auf Eins umspringt, gefolgt von 31 Nullen.

10000000000000000000000000000000

Die erste Stelle stellt allerdings das Vorzeichen da. Mit einer Null als erste Stelle ist die Zahl positiv, mit einer Eins negativ. Dieses Problem wird als Zählerüberlauf bezeichnet (counter overflow).
Tritt das auf, entspricht das der Dezimalzahl -2 147 483 648, es werden somit über 2,1 Milliarden Sekunden vom abgezogen, was zum Zeitpunkt führt.

Computer, die einfach weiterzählen, reisen somit mehr als ein Jahrhundert in die Vergangenheit und zählen von dort aus wieder hoch. Das könnte ungeahnte Auswirkungen haben und Systeme zum Absturz bringen.

Inzwischen ist dieses Problem natürlich bekannt und die Speicherung der Zahl, mit der die Zeit gezählt wird, ist anders umgesetzt.

In JavaScript werden Zahlen nicht mit 32-, sondern 64-Bit gespeichert. Die Zahl ist auch keine Ganzzahl, sondern eine Fließkommazahl. Bei Rechnungen mit sehr hohen Zahlen kann es zu Ungenauigkeiten kommen. Der höchste "sichere" Wert in JavaScript ist trotzdem rund 4,2 Millionen mal größer als der höchste Wert einer vorzeichenbehafteten 32-Bit Ganzzahl.

Number.MAX_SAFE_INTEGER
// => 9007199254740991

Es kann ein Wert von über neun Billiarden problemlos dargestellt werden. Das reicht aus, um 285 616 Jahre vor und nach den Neujahrstag von 1970 zu gehen. Per Definition ist dieser Zeitraum allerdings etwas eingeschränkt auf 100 Millionen Tage um den 1.1.1970 herum.
Zum Vergleich: Vom Neujahrstag 1970 bis zum Neujahrstag 2020 sind nur etwas mehr als 18 Tausend Tage vergangen.

// 1.1.2020 um 1:00 Uhr
(new Date(2020, 0, 1, 1)).getTime() / (24*60*60*1000)
// => 18262

// Warum 1:00 Uhr? Weil das Datum in der deutschen
// Zeitzone erstellt wird, die sich um 1 Stunde von
// der UTC Zeit unterscheidet.

Der Zeitraum, der damit möglich ist, sollte also wirklich ausreichen.

Das jedenfalls steht hinter der Zahl, die getTime zurückliefert.
Das war ein kleiner Exkurs, damit ihr über die Hintergründe von Zeit im Computer Bescheid wisst.