Fix: Refresh-Verlauf zeigte Zeiten 1 Stunde in der Zukunft

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 <noreply@anthropic.com>
Dieser Commit ist enthalten in:
claude-dev
2026-03-07 11:33:04 +01:00
Ursprung 1c7adafa70
Commit ba8f807c96

Datei anzeigen

@@ -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) { function parseUTC(dateStr) {
if (!dateStr) return null; if (!dateStr) return null;
try { 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; return isNaN(d.getTime()) ? null : d;
} catch (e) { } catch (e) {
return null; return null;