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:
@@ -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;
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren