Understanding the Western Time Zone System
The time zone covering California, Oregon, Washington, and parts of Nevada and Idaho runs seven hours behind UTC during standard time and six hours during daylight saving. Most people call it Pacific Standard Time, though that name only applies to roughly half the year. The other half operates under Pacific Daylight Time, and the switch happens on the second Sunday in March and first Sunday in November. I ran a server migration project back in 2019 where the deployment window was scheduled in PST without explicit offset notation. The cron job executed at 2 AM PDT instead of 2 AM PST, which meant it actually ran at 9 AM UTC rather than 9 PM UTC the night before. Every single backup ran early, filled up the staging database, and the production restore failed because the data was from the wrong date range. We spent six hours recovering from it. After that, I made it a rule to never write a time without the offset in any documentation that crosses the DST boundary.
Pacific Standard Time The Rhythm Of Timekeeping Across The West Coast
The official designation for UTC-8 is PST, and UTC-6 during daylight saving is PDT. Both fall under the Pacific Time Zone, which is governed by the same legislation that governs the rest of the North American time zone system. The Uniform Time Act of 1966 established the current framework, and Congress amended it in 2005 to extend daylight saving by about a month compared to the original schedule. What most people do not understand is that time zones are not natural phenomena. They are legal constructs. The boundary between Pacific and Mountain time does not follow geographic logic in many places. In eastern Oregon, the time zone boundary zigzags along county lines for reasons that have nothing to do with sunlight and everything to do with railroad schedules from the 1880s. When you schedule something for 9 AM in Portland versus 9 AM in Boise, you are not dealing with astronomy. You are dealing with a patchwork of state and county jurisdiction decisions made over 140 years. The DST transition itself causes more production issues than almost anything else in infrastructure. At 2 AM local time on the second Sunday in March, clocks jump from 1:59:59 AM to 3:00:00 AM. Any code that assumes a day always contains 86,400 seconds will produce incorrect results during that window. Linux systems handle this with the /etc/localtime symlink and the TZ database, but Windows systems use a different registry structure called the Windows Time Zone Identifier. Migrating a service between those two platforms during DST has caused me to lose sleep more than once.
How to Handle Time Correctly in Practice
Store everything in UTC internally. This is not advice, it is a requirement if your system touches more than one time zone or survives past a DST transition. Log timestamps with the Z suffix to indicate UTC. Use ISO 8601 format, which includes the offset, because 2024-03-10T02:30:00 is ambiguous without context while 2024-03-10T02:30:00-08:00 is not. When displaying time to users, convert from UTC to their local timezone at the last possible moment. Do not store local time in the database. A user in Los Angeles might travel to Phoenix, and Phoenix does not observe DST. If you stored their preferred time as PST, they would be seven hours off from March through November when they visit Arizona. The correct approach is to store their timezone as America/Los_Angeles and let the conversion happen at render time. The IANA timezone database, often called tzdata or the zoneinfo database, is the authoritative source for timezone rules. It gets updated whenever a jurisdiction changes its DST schedule, which happens more often than most engineers realize. Mexico changed its DST policy in 2022, removing it entirely for most of the country. Some parts of India have discussed it. Queensland in Australia considered it recently. If your application hardcodes offsets instead of using tzdata, it will break whenever a government changes its mind about daylight saving.
Get the Full Details

Common Mistakes That Cause Real Problems
The first mistake is assuming that adding eight hours to UTC gives you Pacific time year-round. That works for standard time but fails during daylight saving when the offset is six hours. I have seen this error in scheduling software, notification systems, and even some financial applications. The result is always the same: everything runs two hours early or late for six months of the year. The second mistake is parsing user input without considering the timezone. If a form accepts 9 AM and assumes it is PST, but the user actually entered PDT because their system clock was set to California time, you now have a two-hour discrepancy. The safest practice is to ask for the offset explicitly or to use a library that resolves the timezone from the user's session data. The third mistake involves cron jobs and scheduled tasks. Many people write crontab entries assuming the system clock is in the correct local time, but containers and cloud instances often default to UTC. A cron job that runs at 3 AM in your local Pacific time will execute at 10 AM or 11 AM UTC depending on the season. Always verify the TZ environment variable in your deployment environment.
Tools and Resources
The command line tool date on Linux and macOS can display time in any timezone configured in tzdata. Use date +%Z to check the current timezone abbreviation and date +%z to see the offset. On Windows, Get-TimeZone from PowerShell returns similar information, though the output format differs slightly. For programming, most modern languages have built-in timezone support. Python's datetime module with zoneinfo, JavaScript's Intl.DateTimeFormat, Java's java.time package, and Go's time package all handle timezone conversions correctly when given the right input. The critical detail is that they all require either an explicit offset or a valid timezone identifier. Passing a bare number like -8 without context will not give you correct results during DST transitions. The tzdatabase website maintains the official release schedule and change logs. It is worth monitoring if your infrastructure depends on accurate timezone handling. The current release cycle produces updates four times per year, though emergency updates happen when a jurisdiction makes an unexpected change.
Edge Cases That Trip People Up
Phoenix, Arizona sits in the Pacific Time Zone geographically but observes Mountain Standard Time year-round because it does not participate in daylight saving. If you schedule a meeting for 9 AM Pacific during summer, participants in Phoenix will join at 10 AM their local time. This has caused more missed meetings than I care to count. Saskatchewan, Canada is another weird one. Most of the province stays on Central Standard Time year-round despite being surrounded by areas that switch to Central Daylight Time. The western edge near Calgary uses Mountain Time and does observe DST. Crossing from one part of Saskatchewan to another during a DST transition can shift your local time by an hour without you leaving the province. Kentucky, Indiana, and Michigan all crossed time zone lines multiple times in the twentieth century. The reasons involved railroad companies, grocery store operating hours, and high school football schedules. These are not theoretical concerns. If you are building a system that tracks user locations historically, you will encounter records where the same person appears to have moved time zones without actually moving.

What to Watch Out For
Data retention policies that reference calendar days in local time will process incorrectly during DST transitions. A policy that deletes records older than 90 days will behave differently depending on whether the calculation crosses a spring-forward or fall-back boundary. The difference is one hour, which seems small until you are explaining to an auditor why some records were deleted early and others late. Scheduling libraries that do not use tzdata will silently produce wrong answers. This is the most dangerous category because the error is invisible. The system will run, the output will look correct, and nobody will notice until a jurisdiction changes its DST rule and everything breaks at once. Always verify timezone behavior against a known reference point after any dependency update. Leap seconds are another edge case, though less relevant now since they were officially suspended in 2022. Systems that track time at sub-second precision may still need to handle them, but most applications can safely ignore this concern.
Practical Recommendations
Audit your codebase for hardcoded timezone offsets. Replace any instance of +8 or -8 with proper timezone identifiers. This usually takes less than an hour for a small project and less than a day for a medium-sized codebase. The time investment prevents months of debugging later. Write integration tests that cover DST transition dates. Test your application on March 10 and November 3 for at least three consecutive years to catch any regressions from tzdata updates. These tests should verify that scheduled jobs run at the correct wall clock time and that stored timestamps convert properly in both directions. Document timezone assumptions in your API contracts. If your service accepts timestamps without offsets, state that clearly and specify which timezone is assumed. Better yet, require offsets in your request format. This eliminates ambiguity at the cost of slightly more verbose client code, which is a trade-off that always favors correctness.
The underlying principle is simple: time zones are legal boundaries, not geographic facts, and they change without warning. Building systems that assume static rules guarantees failures when those rules change. Use tzdata, store UTC, convert at display time, and verify your assumptions around DST transitions. That approach has held up for me through multiple decade-spanning projects and survives jurisdiction changes without modification.
