/* ===================================================================== EIN TAGESDATUM IN ORTSZEIT — für Prüfungen (16.09.2026) `new Date().toISOString().slice(0, 10)` ist der bequemste Weg zu einem Datum und der falsche. toISOString rechnet in UTC; Server und Menschen stehen hier auf Europe/Berlin. Zwischen Mitternacht und zwei Uhr morgens liefert die Rechnung deshalb den VORTAG. In einer Prüfung heißt das: Sie ist tagsüber grün und nachts rot, ohne dass irgendetwas kaputt ist. Ein Fehlalarm, den man nicht nachstellen kann, ist der sicherste Weg, eine Prüfung abzuschalten. --------------------------------------------------------------------- WARUM NICHT AUS workspace.js Dort stehen `heuteLokal()` und `tagLokal()` schon, mit demselben Kommentar — aber wer sie importiert, zieht das ganze Haus mit: die Datenbank, die Umstellungen, die Zeitgeber. Eine Prüfung, die nur ein Datum braucht, soll dafür keinen Server hochfahren. Dieselbe Rechnung an zwei Stellen ist hier also Absicht, und es ist die Ausnahme, nicht die Regel: Es sind vier Zeilen ohne Verzweigung, sie können nicht auseinanderlaufen, ohne dass pruef-struktur es meldet. --------------------------------------------------------------------- UND WANN toISOString RICHTIG IST Wenn die Uhrzeit fest auf Mittag steht. `Date.parse("…T12:00:00Z")` plus oder minus ganze Tage bleibt in jeder Zeitzone am selben Kalendertag — deshalb rechnet der Server mit UTC-Mittag, wenn er Fristen VERGLEICHT. Nur beim ANZEIGEN und beim Erzeugen eines Tagesdatums gilt die Ortszeit. ===================================================================== */ const zwei = (n) => String(n).padStart(2, "0"); /** Der heutige Tag in Ortszeit, als `JJJJ-MM-TT`. */ export function heuteLokal() { const d = new Date(); return `${d.getFullYear()}-${zwei(d.getMonth() + 1)}-${zwei(d.getDate())}`; } /** Derselbe Tag, um `versatz` Tage verschoben. Negativ heißt zurück. */ export function tagLokal(versatz = 0) { const d = new Date(Date.now() + versatz * 86400_000); return `${d.getFullYear()}-${zwei(d.getMonth() + 1)}-${zwei(d.getDate())}`; } /** Ein beliebiger Zeitpunkt als Tagesdatum in Ortszeit. * * Für Prüfungen, die von einem FESTEN Zeitpunkt aus rechnen statt von * jetzt — dort ist die Zeitzone genauso entscheidend. */ export function tagVon(zeitpunkt, versatz = 0) { const d = new Date(zeitpunkt + versatz * 86400_000); return `${d.getFullYear()}-${zwei(d.getMonth() + 1)}-${zwei(d.getDate())}`; }