Timezone Hell: Shipping Multi-Region SaaS Without Losing Your Mind
Three common mistakes\n\n1. Storing user-local datetime without the zone. 'Meeting at 15:00' — what does that mean six months later after DST?\n2. Using offsets as identifiers. +09:00 is not a timezone; Asia/Seoul is.\n3. Converting on the client but trusting the server's clock.\n\n## The pattern that works\n\nThree rules:\n\n1. Store everything in UTC. Every timestamp. No exceptions.\n2. Store the user's timezone as an IANA identifier. Asia/Seoul, America/Los_Angeles. Not offsets. Not EST.\n3. Convert at the presentation layer via Intl.DateTimeFormat.\n\n``ts\nfunction display(utcIso, zone) {\n return new Intl.DateTimeFormat('en-US', { timeZone: zone, dateStyle: 'medium', timeStyle: 'short' })\n .format(new Date(utcIso));\n}\n`\n\n## Meeting planner math\n\n`bash\ncurl 'https://api.lazy-mac.com/timezone/api/v1/convert?from=America/New_York&to=Asia/Seoul&time=2026-04-11T09:00:00'\n``\n\n## DST edge cases\n\n- Spring forward — 2:30 AM doesn't exist; scheduled jobs run zero times\n- Fall back — 1:30 AM happens twice; scheduled jobs run twice\n- Arizona, Korea, Japan, China — no DST\n- Lord Howe Island — 30-minute DST\n\nUse lazymac Timezone API: DST-aware, 400+ cities, free 100/day, Pro $9.99/mo unlimited.
📬 MCP Security Weekly
One email per week — new CVEs, scanner improvements, MCPWatch grade drops on popular servers. Free. Unsubscribe anytime.
Support the work: MCP Pro $29/mo · MCPWatch Pro Report $49 · more posts