From 3cc9dd126cf250314c91294bebabf0d5b5f67c4b Mon Sep 17 00:00:00 2001 From: Sergey Katsubo Date: Wed, 5 Nov 2025 17:03:55 +0300 Subject: [PATCH] fix(web): fix timezone dropdown for timestamps lacking milliseconds (#23615) 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 c7bb00fd69..fc4081d3bb 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,