Scheduling Across Timezones Looks Simple Until It Breaks Your Systems

A 9am Pacific meeting lands at 11am Central, but the way your systems handle that one-hour shift determines whether people get pinged at the right time or not. I have spent more years than I care to count watching teams mess this up in ways that cost real money, and honestly most of the errors come from assuming the conversion is straightforward when it rarely is. Here is the raw mechanics of it. Pacific Time runs UTC-8 during standard time and UTC-7 during daylight saving time. Central Time runs UTC-6 during standard time and UTC-5 during daylight saving time. When both zones observe daylight saving time simultaneously, which they do for roughly eight months of the year, the offset between them stays at one hour. That means 9am PT becomes 11am CT with no calculation surprises. When both observe standard time, the offset also stays at one hour, so the math still holds. The edge case exists during the two weeks each spring and fall when one zone has shifted and the other has not, and during that window the offset flips to two hours instead of one. A scheduler built on the assumption of a constant one-hour gap will produce wrong results during those transition periods if it is not handling the transition correctly. The real problem appears when you are coordinating with teams in Europe or Asia who think in their own local time. A 9am PT / 11am CT meeting translates to 4pm or 5pm London depending on the date, and 1pm or 2pm Tokyo depending on the date. If your booking system only captures PT and CT without converting to UTC internally, those remote participants will either miss the meeting or show up an hour early. I watched a fintech team lose a client relationship over exactly this kind of error during a daylight saving transition. The calendar invite was created in the client portal with a fixed offset, the client's timezone was set incorrectly, and the meeting landed at 10am instead of 11am Central. The client showed up at 11am, sat in a empty virtual room for twenty minutes, and never booked again.

How To Actually Handle This In Your Systems

Store everything in UTC at the database layer. No exceptions. When a user schedules a 9am Pacific meeting, convert it to UTC immediately before writing it. That is 4pm UTC during standard time and 4pm UTC during daylight saving time as well, which just happens to be consistent. When your application needs to display that time to a Central Time user, convert from UTC to Central at display time, not at storage time. This single practice eliminates the majority of timezone bugs you will encounter. If you are building a scheduling API, accept timezone identifiers rather than raw UTC offsets. Use strings like America/Los_Angeles and America/Chicago instead of numeric offsets like -0700 or -0600. Numeric offsets are ambiguous during transitions and they do not carry the historical context that the IANA timezone database provides. A user in Chicago who historically has been on UTC-6 but gets a schedule entry from four years ago should resolve correctly against the historical rules in the database, not against whatever offset was current when the code was last deployed. For cron jobs and background processes that trigger at specific wall clock times across regions, test your logic during the forward and backward transition weeks. Set up automated tests that run on simulated dates in November and March and verify the output. I wrote a script once that checked 200 different scheduling configurations across every DST boundary in the United States and Canada over a five year window. Half of the configurations produced incorrect results on at least one transition day.

What Most People Miss About This Shift

The most common mistake is treating the PT to CT conversion as a permanent one-hour difference without accounting for the fact that the actual moment of conversion happens at different instants in different states. Arizona does not observe daylight saving time. Hawaii does not observe daylight saving time. Parts of Indiana have historically changed their participation. When you schedule a 9am PT meeting and a participant joins from Phoenix, Arizona, their local time is 10am during the months when Pacific and Central are both on daylight saving time. That is only a one hour difference from the standard conversion, but only because Phoenix stays put while everyone else moves. If you assume the conversion is always a simple plus two hours from Pacific to Central for every participant, you are wrong half the year and only right the other half. Another nuance that gets overlooked is how meeting scheduling platforms handle the invite object itself. Many platforms serialize the invite with a TZID field and start/end times in local representation, expecting the recipient's calendar client to resolve the timezone on display. This works fine in modern clients but breaks completely on older or enterprise calendar systems that ignore the TZID and treat the timestamp as UTC. An invite that looks correct in Google Calendar can show up two hours off in Microsoft Exchange when the TZID is stripped during migration. I had to build a validation step that compared the resolved UTC time against the expected UTC time after every invite generation to catch these mismatches before they reached users.

Get the Full Details

Illustration of global time coordination for business meetings ...
Illustration of global time coordination for business meetings ...

Practical Implementation

Here is a straightforward approach for Node.js applications since that is what most of my work involves. You parse incoming scheduling requests by resolving the provided timezone string against the IANA database, convert the local datetime to UTC with proper DST awareness, store the UTC value, and convert back to the user's timezone only when rendering. The luxon library handles this cleanly with its DateTime.fromObject method and the timezone option set to the IANA identifier rather than an offset. If you are working in Python, the zoneinfo module in the standard library replaces the older pytz dependency for new projects. Convert incoming datetimes to timezone-aware objects using zoneinfo.ZoneInfo, then normalize to UTC with .astimezone(datetime.timezone.utc). The difference from pytz is that zoneinfo uses the operating system's timezone data and will reflect changes made by governments to timezone rules without requiring a library update. For cron-based systems that need to fire at 9am PT / 11am CT, you need to schedule two separate cron entries or use a library that understands multi-timezone recurrence rules. There is no single cron expression that covers both because the underlying UTC instant differs depending on the season. During the period when both zones are on daylight saving time, 9am PT is 16:00 UTC and 11am CT is also 16:00 UTC, so one cron job works. During the period when the offset shifts due to a transition, those two events no longer align in UTC, and you need separate triggers or a scheduling library that evaluates the recurrence against the local timezone rules rather than against a fixed UTC instant.

Where This Approach Falls Apart

The UTC internal storage model works for scheduling and coordination but it introduces friction when you need to do timezone-aware analytics. Aggregating meeting volume by Central Time across a quarter requires converting every stored UTC timestamp back to Central at query time, which adds computational overhead and can skew daily aggregation boundaries if you are not careful about the conversion. A meeting that starts at 11:30pm Central and ends at 12:15am Central will appear in the Central Time data as falling on two different calendar days. Most reporting tools do not account for this automatically and you will get inflated day counts if you aggregate by converted local date without deduplicating or splitting the events at the timezone boundary. Another limitation is that timezone databases themselves are not perfect. Governments change timezone rules without warning, and the IANA database updates quarterly. If your application depends on a bundled copy of the timezone database rather than pulling from the operating system or a live update service, you will have stale data. I saw a major e-commerce platform miss daylight saving time changes for six months because they had frozen their timezone package dependency to avoid regressions. Users in affected regions experienced scheduling errors on their orders and support tickets spiked dramatically until the issue was discovered. If your organization operates primarily within a single timezone and rarely coordinates across regions, maintaining full IANA timezone support may be overkill. A simpler approach of storing everything in UTC and converting to your primary timezone at the application boundary can reduce complexity significantly. The tradeoff is that adding a second timezone later becomes expensive because every query, report, and integration point needs to be updated to handle the new conversion. Plan for at least two operating timezones from the start even if you only actively support one right now.

The underlying principle is that a one hour shift between two zones is trivial to handle in isolation but compounds quickly when you add more zones, more transitions, and more systems that depend on the same data. Get the UTC storage step right first and the rest follows mechanically.

The Power of Time Zone Tools for Better Global Coordination
The Power of Time Zone Tools for Better Global Coordination