From ba8f807c963660b528d91ce04be499ba25e982e9 Mon Sep 17 00:00:00 2001 From: claude-dev Date: Sat, 7 Mar 2026 11:33:04 +0100 Subject: [PATCH] Fix: Refresh-Verlauf zeigte Zeiten 1 Stunde in der Zukunft MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit parseUTC() hängte blind ein 'Z' (UTC) an alle Timestamps, aber die DB speichert Lokalzeit (Europe/Berlin). Bei CET (UTC+1) wurden alle Zeiten 1 Stunde zu spät angezeigt. Neue Logik: Timestamps mit 'Z' oder '+' werden direkt geparst. Timestamps ohne Zeitzonen-Info werden als Europe/Berlin interpretiert mit korrektem Offset (auch bei Sommer-/Winterzeit-Wechsel). Betrifft: Refresh-Verlauf, Artikel-Zeitstempel, Snapshots, Lagebild-Stand Co-Authored-By: Claude Opus 4.6 --- src/static/js/components.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/static/js/components.js b/src/static/js/components.js index 1cc1bfc..e71ad33 100644 --- a/src/static/js/components.js +++ b/src/static/js/components.js @@ -1,10 +1,26 @@ /** - * Parst einen UTC-Zeitstring vom Server in ein Date-Objekt. + * Parst einen Zeitstring vom Server in ein Date-Objekt. + * Timestamps mit 'Z' oder '+' werden direkt geparst (echtes UTC/Offset). + * Timestamps ohne Zeitzonen-Info werden als Europe/Berlin interpretiert, + * da die DB alle Zeiten in Lokalzeit speichert. */ function parseUTC(dateStr) { if (!dateStr) return null; try { - const d = new Date(dateStr.endsWith('Z') ? dateStr : dateStr + 'Z'); + if (dateStr.endsWith('Z') || dateStr.includes('+')) { + const d = new Date(dateStr); + return isNaN(d.getTime()) ? null : d; + } + // DB-Timestamps sind Europe/Berlin Lokalzeit. + // Aktuellen Berlin-UTC-Offset ermitteln und anwenden. + const normalized = dateStr.replace(' ', 'T'); + const naive = new Date(normalized + 'Z'); // als UTC parsen + if (isNaN(naive.getTime())) return null; + // Berlin-Offset fuer diesen Zeitpunkt bestimmen + const berlinStr = naive.toLocaleString('sv-SE', { timeZone: 'Europe/Berlin' }); + const berlinAsUTC = new Date(berlinStr.replace(' ', 'T') + 'Z'); + const offsetMs = naive.getTime() - berlinAsUTC.getTime(); + const d = new Date(naive.getTime() + offsetMs); return isNaN(d.getTime()) ? null : d; } catch (e) { return null;