diff --git a/frontend/harness-dev.html b/frontend/harness-dev.html new file mode 100644 index 0000000..9b6d587 --- /dev/null +++ b/frontend/harness-dev.html @@ -0,0 +1,149 @@ + + + + + +Harness + + + + + +
+ + diff --git a/frontend/src/pages/Settings.jsx b/frontend/src/pages/Settings.jsx index 6db23aa..5eafe3f 100644 --- a/frontend/src/pages/Settings.jsx +++ b/frontend/src/pages/Settings.jsx @@ -97,10 +97,28 @@ const TAB_SCOPES = { }; /** „vor 3 Minuten" statt rohem Zeitstempel */ -function vorWieLange(iso) { - // Die Datenbank speichert UTC ohne Kennzeichnung — sonst rechnet der - // Browser sie als Ortszeit und alles sieht Stunden alt aus. - const min = Math.floor((Date.now() - new Date(iso.replace(' ', 'T') + 'Z').getTime()) / 60000); +/** + * Zeitstempel aus der Datenbank lesen — es kommen zwei Formate an: + * + * "2026-07-30 12:34:56" SQLite datetime('now'), UTC ohne Kennzeichnung + * "2026-07-30T12:34:56.789Z" toISOString(), Zone schon dabei + * + * Beim ersten muss das Z ergänzt werden, sonst rechnet der Browser die Zeit + * als Ortszeit. Beim zweiten darf es das gerade nicht — "…ZZ" ergibt ein + * ungültiges Datum und in der Anzeige stand dann NaN. + */ +function alsDatum(wert) { + if (!wert) return null; + const s = String(wert).trim(); + const hatZone = /[Zz]$|[+-]\d{2}:?\d{2}$/.test(s); + const d = new Date(hatZone ? s : `${s.replace(' ', 'T')}Z`); + return Number.isNaN(d.getTime()) ? null : d; +} + +function vorWieLange(wert) { + const d = alsDatum(wert); + if (!d) return '—'; + const min = Math.floor((Date.now() - d.getTime()) / 60000); if (min < 1) return 'gerade eben'; if (min < 60) return `vor ${min} Min`; const std = Math.floor(min / 60); @@ -1112,9 +1130,10 @@ export default function Settings({ me }) { const unfinished = activeModules.filter((m) => m.missing.length > 0); /** Wie alt ist ein Zeitstempel, in Tagen — fuer die Nebenzeilen */ - function alterInTagen(iso) { - if (!iso) return null; - return Math.floor((Date.now() - new Date(iso.replace(' ', 'T') + 'Z').getTime()) / 86400000); + function alterInTagen(wert) { + const d = alsDatum(wert); + if (!d) return null; + return Math.floor((Date.now() - d.getTime()) / 86400000); } /** „vor 3 Tagen" bzw. „heute" fuer eine Nebenzeile */