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;