diff --git a/src/server/generate_form.py b/src/server/generate_form.py index f4dbdda..800e524 100644 --- a/src/server/generate_form.py +++ b/src/server/generate_form.py @@ -563,6 +563,30 @@ async function checkFormStatus() {{ let reopenAtMs = null; +const easternFormatter = new Intl.DateTimeFormat('en-US', {{ + timeZone: 'America/New_York', + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hourCycle: 'h23', +}}); + +function getEasternParts(date) {{ + const values = {{}}; + easternFormatter.formatToParts(date).forEach(part => {{ + if (part.type !== 'literal') values[part.type] = Number(part.value); + }}); + return values; +}} + +function getEasternOffsetMs(date) {{ + const parts = getEasternParts(date); + return Date.UTC(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second) - date.getTime(); +}} + function startCountdown(data) {{ if (data && data.reopen_at) {{ reopenAtMs = data.reopen_at * 1000; @@ -578,17 +602,15 @@ function updateCountdown() {{ if (reopenAtMs) {{ target = new Date(reopenAtMs); }} else {{ - const etStr = now.toLocaleString('en-US', {{ timeZone: 'America/New_York', hour12: false }}); - const etDate = new Date(etStr); - const day = etDate.getDay(); - const hour = etDate.getHours(); + const etNow = getEasternParts(now); + const day = new Date(Date.UTC(etNow.year, etNow.month - 1, etNow.day)).getUTCDay(); + const hour = etNow.hour; let daysUntil = (1 - day + 7) % 7; if (daysUntil === 0 && hour >= 8) daysUntil = 7; - target = new Date(etDate); - target.setDate(target.getDate() + daysUntil); - target.setHours(8, 0, 0, 0); + const targetEtMs = Date.UTC(etNow.year, etNow.month - 1, etNow.day + daysUntil, 8, 0, 0); + target = new Date(targetEtMs - getEasternOffsetMs(new Date(targetEtMs))); }} let diff = Math.max(0, Math.floor((target - now) / 1000));