From 53c4340d7668049063ea26e638fc78d7f576b5bd Mon Sep 17 00:00:00 2001 From: timmy Date: Thu, 20 Aug 2026 12:26:35 +0000 Subject: [PATCH] fix: tolerate invalid device timezones in Week Ahead (Closes #1177) --- frontend/today-rollover.js | 8 +++++++- tests/test_today_rollover.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/frontend/today-rollover.js b/frontend/today-rollover.js index 5f35281..d01eb60 100644 --- a/frontend/today-rollover.js +++ b/frontend/today-rollover.js @@ -4,7 +4,13 @@ function createTodayRollover(options = {}) { Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'); function timeZone() { - return options.timeZone?.() || resolvedTimeZone(); + const candidate = options.timeZone?.() || resolvedTimeZone(); + try { + new Intl.DateTimeFormat('en', { timeZone: candidate }).format(now()); + return candidate; + } catch (_error) { + return 'UTC'; + } } function localDate() { diff --git a/tests/test_today_rollover.py b/tests/test_today_rollover.py index b1c5d56..b533bb1 100644 --- a/tests/test_today_rollover.py +++ b/tests/test_today_rollover.py @@ -132,6 +132,18 @@ process.stdout.write(JSON.stringify({{date:rollover.localDate(),zone:rollover.ti assert run_node(script) == {"date": "2026-11-01", "zone": "America/New_York"} +def test_invalid_runtime_timezone_falls_back_to_utc_without_breaking_planners(): + script = f""" +const create = require({json.dumps(str(ROLLOVER))}); +const rollover = create({{ + now:()=>new Date('2026-08-20T23:30:00Z'), + resolvedTimeZone:()=> 'Etc/Unknown' +}}); +process.stdout.write(JSON.stringify({{date:rollover.localDate(),zone:rollover.timeZone()}})); +""" + assert run_node(script) == {"date": "2026-08-20", "zone": "UTC"} + + def test_rollover_is_one_durable_sync_operation_with_the_server_revision(): script = f""" const createSync = require({json.dumps(str(SYNC))});