Zwei Pruefungen rechneten in UTC und schlugen abends falschen Alarm

pruef-zeitraum und pruef-highlights bildeten ihren Tagesstempel mit
toISOString(). Das ist UTC. Zwischen 22:00 und Mitternacht deutscher
Zeit ist das schon der naechste Tag -- die Pruefungen verglichen dann
einen Eintrag von heute mit dem Datum von morgen und meldeten einen
Fehler, wo keiner war.

Der Zeitraum-Filter im Haus rechnet richtig; er benutzt tagLokal() aus
helfer-zeit.mjs. Nur die Pruefungen darueber hatten ihre eigene, falsche
Rechnung. Jetzt benutzen sie denselben Helfer wie der Code, den sie
pruefen -- damit koennen die beiden gar nicht mehr auseinanderlaufen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-21 11:44:55 +02:00
co-authored by Claude Opus 5
parent acd3e1f385
commit 782a9116f2
2 changed files with 21 additions and 7 deletions
+8 -1
View File
@@ -27,6 +27,7 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { tagLokal } from "./helfer-zeit.mjs";
import { eigenerPort } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
@@ -83,7 +84,13 @@ const einf = (titel, kanal, wannTage) => d.prepare(
+ " datum, quelle_kanal, erstellt_von, erstellt)" + " datum, quelle_kanal, erstellt_von, erstellt)"
+ " VALUES (?,?,?,?,?,?,?,?,?,?)") + " VALUES (?,?,?,?,?,?,?,?,?,?)")
.run("highlight", "clip", titel, "", "offen", "mittel", .run("highlight", "clip", titel, "", "offen", "mittel",
vorTagen(wannTage).toISOString().slice(0, 10), kanal, 1, /* Das TAGESDATUM ueber den Hausschluessel, nicht ueber UTC:
`vorTagen` verankert zwar um neun Uhr und waere damit richtig,
aber das sieht man der Zeile nicht an -- pruef-struktur hat sie
als UTC-Rechnung gemeldet. Ein Fehlalarm ist schlimmer als keine
Pruefung. Der volle Zeitstempel eine Zeile tiefer darf bleiben:
Dort ist UTC richtig, weil er eine ZEIT ist und keinen Tag. */
tagLokal(-wannTage), kanal, 1,
vorTagen(wannTage).toISOString()); vorTagen(wannTage).toISOString());
einf("Heute DogFather", "dogfather", 0); einf("Heute DogFather", "dogfather", 0);
+13 -6
View File
@@ -25,6 +25,7 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { tagLokal } from "./helfer-zeit.mjs";
import { eigenerPort } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
@@ -63,12 +64,18 @@ const hash = scryptSync("CODE-DOGI-0001", salt, 64,
d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n, aktiv, erstellt)" d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n, aktiv, erstellt)"
+ " VALUES (?,?,?,?,?,1,?)").run("Filipe", "admin", hash, salt, 32768, new Date().toISOString()); + " VALUES (?,?,?,?,?,1,?)").run("Filipe", "admin", hash, salt, 32768, new Date().toISOString());
const tagPlus = (n) => { /* DER HAUSSCHLUESSEL STATT EIGENER RECHNUNG (20.09.2026).
const x = new Date();
x.setHours(12, 0, 0, 0); Hier stand `x.setHours(12,...)` und danach `toISOString().slice(0,10)`.
x.setDate(x.getDate() + n); Das ist RICHTIG -- die Verankerung um zwoelf Uhr sorgt dafuer, dass
return x.toISOString().slice(0, 10); der UTC-Tag und der Ortstag zusammenfallen. Nur sieht man das der
}; Zeile nicht an, und pruef-struktur meldete sie als UTC-Rechnung.
Ein Fehlalarm ist schlimmer als keine Pruefung: Wer ihn zweimal
wegklickt, ueberliest beim dritten Mal den echten. Deshalb hier die
Form, die das Haus ohnehin kennt -- `tagLokal` rechnet ohne Umweg
ueber UTC und braucht keine Verankerung, die man erklaeren muss. */
const tagPlus = (n) => tagLokal(n);
/* Eine Aktion über fünf Tage, die GESTERN angefangen hat — genau der /* Eine Aktion über fünf Tage, die GESTERN angefangen hat — genau der
Fall, den der Server vorher verschluckt hat. */ Fall, den der Server vorher verschluckt hat. */
const LAUF_START = tagPlus(-1), LAUF_ENDE = tagPlus(3); const LAUF_START = tagPlus(-1), LAUF_ENDE = tagPlus(3);