+
+
+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 */