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));// I5.3 · ca. 35 Min. · Aufbau
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.
Danach können Sie
Aufwärmen · Aufgabe 1 von 7
const [, year, month] = "2026-10-05".match(/(\d{4})-(\d{2})/);
console.log(Number(month));Vorhersagen · Aufgabe 2 von 7
const d = new Date(Date.UTC(2026, 10, 5));
console.log(d.toISOString().slice(0, 10));Üben · Aufgabe 3 von 7
const ms = Date.UTC(2026, 9, 6) - Date.UTC(2026, 9, 5);
console.log(ms / ____);Üben · Aufgabe 4 von 7
Üben · Aufgabe 5 von 7
const d = new Date("2026-10-05");
console.log(d.getUTCHours(), d.toISOString());Denksport · Aufgabe 6 von 7
const d = new Date("2026-10-05T00:00");
console.log(d.toISOString());Anwenden · Aufgabe 7 von 7
Prüfen Sie Ihr Ergebnis anhand dieser Liste
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 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.jsAusgabe
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: trueTab 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.
Übung 1 von 2
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.
Führen Sie die Tests aus: 2026-10-05 plus 7 ergibt ein Datum im November. Welche Zahl ist verschoben?
Der String sagt 10 für den Oktober, aber Date.UTC zählt Monate ab 0.
new Date(Date.UTC(year, month - 1, day + days))
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);
}
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.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenÜbung 2 von 2
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.
Führen Sie die Tests aus: Call kommt nach Lunch. Ist der String "14:30+02:00" als Moment später als "13:00Z"?
new Date(a.at) versteht den Offset. Zwei Dates zu subtrahieren ergibt die Differenz in Millisekunden.
return [...events].sort((a, b) => new Date(a.at) - new Date(b.at));
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));
}
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.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenconst due = new Date("31.12.2026");
console.log(due.toISOString());
Was Node.js ausgibt
RangeError: Invalid time valueWarum, 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()).
const due = Date.UTC(2026, 9, 5);
console.log(due.toISOString());
Was Node.js ausgibt
TypeError: due.toISOString is not a functionWarum, 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.
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 functionWarum, 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
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.