From 740b803918028d1ecff904f39dce311758d1d915 Mon Sep 17 00:00:00 2001 From: Sergey Katsubo Date: Tue, 4 Nov 2025 16:12:41 +0300 Subject: [PATCH] Fix timezone selector for timestamps without milliseconds --- web/src/lib/modals/timezone-utils.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/web/src/lib/modals/timezone-utils.ts b/web/src/lib/modals/timezone-utils.ts index c7bb00fd69be1..fc4081d3bbf2d 100644 --- a/web/src/lib/modals/timezone-utils.ts +++ b/web/src/lib/modals/timezone-utils.ts @@ -70,9 +70,14 @@ export function getModernOffsetForZoneAndDate( function zoneOptionForDate(zone: string, date: string) { const { offsetMinutes, offsetFormat: zoneOffsetAtDate } = getModernOffsetForZoneAndDate(zone, date); - // For validity, we still need to check if the exact date/time exists in the *original* timezone (for gaps/overlaps). - const dateForValidity = DateTime.fromISO(date, { zone }); - const valid = dateForValidity.isValid && date === dateForValidity.toFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); + // For validity, we still need to check if the exact date/time exists in the *original* timezone. + // Use the fact that in DST gaps Luxon advances the missing time by an hour. + // Ignore milliseconds: + // - milliseconds are not relevant for TZ calculations + // - browsers strip insignificant .000 making string comparison with milliseconds more fragile. + const dateInTimezone = DateTime.fromISO(date, { zone }); + const exists = date.replace(/\.\d+/, '') === dateInTimezone.toFormat("yyyy-MM-dd'T'HH:mm:ss"); + const valid = dateInTimezone.isValid && exists; return { value: zone, offsetMinutes,