diff --git a/frontend/src/components/test-detail/LiveTimer.tsx b/frontend/src/components/test-detail/LiveTimer.tsx index a7cf7a4..06000ce 100644 --- a/frontend/src/components/test-detail/LiveTimer.tsx +++ b/frontend/src/components/test-detail/LiveTimer.tsx @@ -32,7 +32,10 @@ export default function LiveTimer({ const isPaused = pausedAt !== null; useEffect(() => { - const start = new Date(startedAt).getTime(); + // Backend returns naive UTC datetimes without 'Z'. Force UTC so the + // browser doesn't misinterpret them as local time (e.g. UTC+2 → 2h off). + const utcStr = startedAt.endsWith("Z") || startedAt.includes("+") ? startedAt : startedAt + "Z"; + const start = new Date(utcStr).getTime(); const tick = () => { const now = Date.now(); @@ -40,7 +43,8 @@ export default function LiveTimer({ let totalPaused = pausedSeconds; if (isPaused) { - const pauseStart = new Date(pausedAt!).getTime(); + const pausedAtUtc = pausedAt!.endsWith("Z") || pausedAt!.includes("+") ? pausedAt! : pausedAt! + "Z"; + const pauseStart = new Date(pausedAtUtc).getTime(); totalPaused += Math.floor((now - pauseStart) / 1000); }