Zum Inhalt springen
aviral gupta

// I5.3 · ca. 35 Min. · Aufbau

Datum und Uhrzeit mit Date

Nach dieser Lektion erzeugen Sie ein Datum ohne den Monats-Fehler um eins, machen daraus einen Timestamp oder einen ISO-String und zurück und rechnen mit Daten und vergleichen sie sicher.

Lektion 3 von 5 in I5 Mit Daten arbeiten

Danach können Sie

  • Daten mit Date.UTC und new Date erzeugen und dabei bedenken, dass Monate ab 0 zählen
  • Timestamps und ISO-Strings lesen und schreiben und wissen, welche Strings UTC bedeuten
  • Mit Daten in Millisekunden rechnen und sie richtig vergleichen
  1. Aufwärmen · Aufgabe 1 von 7

    Zum Aufwärmen aus Lektion I5.2. Was gibt das aus?

    const [, year, month] = "2026-10-05".match(/(\d{4})-(\d{2})/);
    console.log(Number(month));
  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es vorher, bevor Sie weiterlesen. Das Monatsargument ist 10. Was gibt das aus?

    const d = new Date(Date.UTC(2026, 10, 5));
    console.log(d.toISOString().slice(0, 10));
  3. Üben · Aufgabe 3 von 7

    Ergänzen Sie die Anzahl der Millisekunden eines Tags, sodass das 1 ausgibt.

    const ms = Date.UTC(2026, 9, 6) - Date.UTC(2026, 9, 5);
    console.log(ms / ____);
    console.log(ms /);
  4. Üben · Aufgabe 4 von 7

    Ordnen Sie jedem Aufruf zu, was er liefert.

  5. Üben · Aufgabe 5 von 7

    Ein reiner Datums-String. Was gibt das aus?

    const d = new Date("2026-10-05");
    console.log(d.getUTCHours(), d.toISOString());
  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. Auf einem Computer in Berlin, wo der Oktober UTC+2 ist. Der String hat eine Uhrzeit, aber kein Z. Was gibt das aus?

    const d = new Date("2026-10-05T00:00");
    console.log(d.toISOString());
  7. Anwenden · Aufgabe 7 von 7

    Kleine Aufgabe: Schreiben Sie daysBetween(from, to) für zwei reine Datums-Strings wie "2026-10-05" und "2026-12-24". Geben Sie die Tage bis dahin aus, den Wochentag des zweiten Datums mit getUTCDay() und einer Liste von Tagesnamen und das Datum einer Erinnerung eine Woche davor als YYYY-MM-DD.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Ein Termin, sieben Datumsfragen

Ein Termin beginnt am 5. Oktober 2026 um 14:30 UTC, gebaut mit Date.UTC und Monat 9. Das Programm gibt ihn als ISO-String aus, als seine Monatsnummer und als Timestamp und parst dann zwei ISO-Strings. Es addiert 90 Minuten und zählt die Tage bis zum 24. Dezember in Millisekunden, zeigt, dass der 31. Februar überläuft, vergleicht Daten und erkennt ein Invalid Date. Jede Zeile nutzt UTC, die Ausgabe ist also auf jedem Computer dieselbe.

main.js

// 1. Months count from 0: 9 is October.
const start = new Date(Date.UTC(2026, 9, 5, 14, 30));
console.log("start:", start.toISOString());
console.log("getUTCMonth:", start.getUTCMonth(), "-> month number", start.getUTCMonth() + 1);

// 2. A Date is a timestamp: milliseconds since 1970-01-01 UTC.
console.log("timestamp:", start.getTime());
console.log("timestamp 0:", new Date(0).toISOString());

// 3. Parsing ISO strings: date-only means UTC; Z or +02:00 say it exactly.
console.log(new Date("2026-10-05").toISOString());
console.log(new Date("2026-10-05T14:30:00+02:00").toISOString());

// 4. Arithmetic in milliseconds.
const MINUTE = 60 * 1000;
const DAY = 24 * 60 * MINUTE;
const end = new Date(start.getTime() + 90 * MINUTE);
console.log("90 minutes later:", end.toISOString());
console.log("days to 24 December:", (Date.UTC(2026, 11, 24) - Date.UTC(2026, 9, 5)) / DAY);

// 5. Overflow carries over: 31 February becomes 3 March.
console.log(new Date(Date.UTC(2026, 1, 31)).toISOString().slice(0, 10));

// 6. Comparing: < works on timestamps, === compares objects.
const a = new Date("2026-10-05");
const b = new Date("2026-10-05");
console.log(a < end, a === b, a.getTime() === b.getTime());

// 7. A string that is not a date gives an Invalid Date.
const bad = new Date("2026-13-01");
console.log("invalid:", Number.isNaN(bad.getTime()));

Ausführen mit

node main.js

Ausgabe

start: 2026-10-05T14:30:00.000Z
getUTCMonth: 9 -> month number 10
timestamp: 1791210600000
timestamp 0: 1970-01-01T00:00:00.000Z
2026-10-05T00:00:00.000Z
2026-10-05T12:30:00.000Z
90 minutes later: 2026-10-05T16:00:00.000Z
days to 24 December: 80
2026-03-03
true false true
invalid: true
  • getUTCMonth() gab 9 für den Oktober; addieren Sie 1 nur, wenn Sie den Monat Menschen zeigen.
  • +02:00 im String hat die Zeit zwei Stunden zurück nach UTC verschoben.
  • a === b war für dasselbe Datum false: === fragt, ob es dasselbe Objekt ist.
Ändern und ausführen

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.

Übungen

Übung 1 von 2

Tage zu einem Datum addieren

addDays(isoDate, days) bekommt einen reinen Datums-String wie "2026-10-05" und gibt das Datum so viele Tage später zurück, als "YYYY-MM-DD". Negative Tage gehen zurück. Der Startcode gibt den Monat aus dem String direkt an Date.UTC weiter, sodass jedes Ergebnis einen Monat zu spät landet. Korrigieren Sie das.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Führen Sie die Tests aus: 2026-10-05 plus 7 ergibt ein Datum im November. Welche Zahl ist verschoben?

  2. Hinweis 2

    Der String sagt 10 für den Oktober, aber Date.UTC zählt Monate ab 0.

  3. Hinweis 3

    new Date(Date.UTC(year, month - 1, day + days))

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

export function addDays(isoDate, days) {
  const [year, month, day] = isoDate.split("-").map(Number);
  const date = new Date(Date.UTC(year, month - 1, day + days));
  return date.toISOString().slice(0, 10);
}
Auf dem eigenen Computer ausführen

Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.js

export function addDays(isoDate, days) {
  const [year, month, day] = isoDate.split("-").map(Number);
  const date = new Date(Date.UTC(year, month, day + days));
  return date.toISOString().slice(0, 10);
}

main.test.js

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {addDays} from './main.js';

test('2026-10-05 plus 7 Tage ist 2026-10-12', () => {
  const got = addDays('2026-10-05', 7);
  assert.equal(got, '2026-10-12', `addDays('2026-10-05', 7) gab ${got}`);
});

test('Das Addieren von Tagen überschreitet das Monatsende', () => {
  const got = addDays('2026-01-30', 3);
  assert.equal(got, '2026-02-02', `addDays('2026-01-30', 3) gab ${got}`);
});

test('Negative Tage gehen zurück', () => {
  const got = addDays('2026-03-01', -1);
  assert.equal(got, '2026-02-28', `addDays('2026-03-01', -1) gab ${got}`);
});

package.json

{
  "type": "module"
}

package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.

Programm ausführen:

node main.js

Prüfungen ausführen (learnrun.js muss im selben Ordner liegen):

node --test
learnrun.js herunterladen

Übung 2 von 2

Termine nach Zeit sortieren

sortByTime(events) bekommt Objekte wie {title: "Call", at: "2026-10-05T14:30:00+02:00"} und gibt ein neues Array zurück, sortiert vom frühesten Moment zum spätesten, ohne die Eingabe zu ändern. Der Startcode vergleicht die Strings, was falsch ist, wenn die Offsets sich unterscheiden: 14:30+02:00 ist 12:30 UTC. Vergleichen Sie stattdessen die Momente.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Führen Sie die Tests aus: Call kommt nach Lunch. Ist der String "14:30+02:00" als Moment später als "13:00Z"?

  2. Hinweis 2

    new Date(a.at) versteht den Offset. Zwei Dates zu subtrahieren ergibt die Differenz in Millisekunden.

  3. Hinweis 3

    return [...events].sort((a, b) => new Date(a.at) - new Date(b.at));

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

export function sortByTime(events) {
  return [...events].sort((a, b) => new Date(a.at) - new Date(b.at));
}
Auf dem eigenen Computer ausführen

Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.js

export function sortByTime(events) {
  return [...events].sort((a, b) => a.at.localeCompare(b.at));
}

main.test.js

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {sortByTime} from './main.js';

const events = [
  {title: 'Lunch', at: '2026-10-05T13:00:00Z'},
  {title: 'Call', at: '2026-10-05T14:30:00+02:00'},
  {title: 'Breakfast', at: '2026-10-05T07:00:00Z'}
];
const titles = (list) => list.map((e) => e.title).join(', ');

test('Termine mit Z werden nach Zeit sortiert', () => {
  const got = sortByTime([events[0], events[2]]);
  assert.equal(titles(got), 'Breakfast, Lunch', `die Reihenfolge ist ${titles(got)}`);
});

test('Der Offset zählt: 14:30+02:00 liegt vor 13:00 UTC', () => {
  const got = sortByTime(events);
  assert.equal(titles(got), 'Breakfast, Call, Lunch', `die Reihenfolge ist ${titles(got)}`);
});

test('Das Eingabe-Array wird nicht verändert', () => {
  const input = [...events];
  sortByTime(input);
  assert.equal(titles(input), 'Lunch, Call, Breakfast', `die Eingabe wurde zu ${titles(input)}`);
});

package.json

{
  "type": "module"
}

package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.

Programm ausführen:

node main.js

Prüfungen ausführen (learnrun.js muss im selben Ordner liegen):

node --test
learnrun.js herunterladen

Häufige Fehler

Ein Datum im deutschen Format parsen

const due = new Date("31.12.2026");
console.log(due.toISOString());

Was Node.js ausgibt

RangeError: Invalid time value

Warum, und die Lösung

Nur das ISO-Format, etwa "2026-12-31", funktioniert garantiert. "31.12.2026" ergibt ein Invalid Date, und toISOString() wirft bei einem Invalid Date. Zerlegen Sie den Text selbst und nutzen Sie Date.UTC(2026, 11, 31), oder wandeln Sie den Text zuerst in ISO um. Prüfen Sie ein geparstes Datum mit Number.isNaN(date.getTime()).

Date.UTC wie ein Date behandeln

const due = Date.UTC(2026, 9, 5);
console.log(due.toISOString());

Was Node.js ausgibt

TypeError: due.toISOString is not a function

Warum, und die Lösung

Date.UTC gibt eine Zahl zurück, den Timestamp, kein Date-Objekt, es hat also keine Date-Methoden. Verpacken Sie es: const due = new Date(Date.UTC(2026, 9, 5)). Auch Date.now() ist eine Zahl.

Von JSON ein Date zurückerwarten

const saved = JSON.stringify({ due: new Date(Date.UTC(2026, 9, 5)) });
const task = JSON.parse(saved);
console.log(task.due.getUTCFullYear());

Was Node.js ausgibt

TypeError: task.due.getUTCFullYear is not a function

Warum, und die Lösung

JSON kennt keinen Datumstyp. JSON.stringify schreibt ein Date als seinen ISO-String, und JSON.parse liefert diesen String zurück, kein Date. Machen Sie nach dem Parsen wieder ein Date daraus: new Date(task.due).getUTCFullYear() ist 2026.

JavaScript im Browser: die eigene Engine Ihres Browsers in einem abgeschotteten Worker. Syntaxfehler findet acorn 8.18.0, MIT. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Ein Date ist ein Timestamp

Intern ist ein Date eine einzige Zahl: Millisekunden seit Mitternacht am Beginn des 1. Januar 1970, UTC. getTime() und Date.now() liefern diese Zahl. Was Sie sehen, hängt davon ab, wie sie gelesen wird: getHours(), getDate() und toString() nutzen die Zeitzone des Computers, getUTCHours(), getUTCDate() und toISOString() nutzen UTC und geben auf jedem Rechner dasselbe aus. Monate zählen ab 0: Date.UTC(2026, 9, 5) ist der 5. Oktober, und der Dezember ist 11. Zu große Werte laufen über: Tag 31 des Februars liegt im März. MDN nennt Date neben der neueren Temporal-API inzwischen ein Legacy-Feature, aber Temporal ist noch nicht überall verfügbar, und Node.js 24 hat es nicht.

Erzeugen und Parsen

Date.UTC(year, monthIndex, day, hours, minutes) liefert einen Timestamp für diesen Moment in UTC; verpacken Sie ihn in new Date(...), um ein Date zu bekommen. new Date(year, monthIndex, day) liest dieselben Zahlen als Ortszeit, der Moment unterscheidet sich also von Computer zu Computer. Strings: Nutzen Sie das ISO-Format. Ein reiner Datums-String wie "2026-10-05" wird als Mitternacht UTC gelesen. Ein Datum-mit-Uhrzeit-String ohne Offset, "2026-10-05T14:30", wird als Ortszeit gelesen; ergänzen Sie Z oder +02:00, um ihn eindeutig zu machen. toISOString() schreibt immer UTC mit einem Z, und JSON.stringify schreibt ein Date genauso, als String.

Rechnen und Vergleichen

Rechnen Sie mit Daten auf Timestamps: new Date(date.getTime() + 90 * 60 * 1000) ist 90 Minuten später, und (later - earlier) / (24 * 60 * 60 * 1000) ist die Anzahl der Tage zwischen zwei UTC-Mitternächten. Zwei Dates zu subtrahieren ergibt Millisekunden. a < b funktioniert, weil der Vergleich beide in Zahlen verwandelt, aber a === b vergleicht zwei Objekte und ist für zwei gleiche Daten false: Vergleichen Sie a.getTime() === b.getTime(). Sortieren Sie mit (a, b) => a - b. Ein String, der kein gültiges Datum ist, ergibt ein Invalid Date, dessen getTime() NaN ist und dessen toISOString() einen RangeError wirft.

Quellen

Zuletzt geprüft am 5. Oktober 2026