Concepts & human language

DST & the edges

Spring-forward gaps make some local times nonexistent; fall-back overlaps make others ambiguous.

Daylight Saving Time (DST) is the practice of advancing clocks — typically by one hour — during warmer months so that evening daylight lasts longer. When a zone transitions, the offset changes: for example, America/New_York switches between −05:00 (EST) and −04:00 (EDT).

At the spring-forward transition, clocks skip forward: the local clock jumps from, say, 01:59:59 to 03:00:00. The hour from 02:00 to 02:59:59 never occurs on the wall clock. Any local time in that range is nonexistent — it corresponds to no valid instant.

At the fall-back transition, clocks repeat an hour: the local clock runs from 01:59:59 back to 01:00:00. Every local time in the range 01:00:00–01:59:59 occurs twice, once in each offset. Any such time is ambiguous — it corresponds to two different instants.

Consequences for software

Code that constructs a local datetime directly (e.g. “create a datetime for 2026-03-08 02:30 in America/New_York”) must have a policy for gaps (raise an error? shift forward? shift backward?) and for overlaps (pick the earlier instant? the later? require explicit disambiguation). Different libraries make different default choices, and many do not document them clearly.

Pitfall: Assuming every local calendar day is exactly 24 hours long. In zones that observe DST, the spring-forward day is 23 hours and the fall-back day is 25 hours. Code that calculates “end of day” as start_of_day + 86400 seconds will be wrong on those two days each year.

Pitfall: Scheduling a recurring job at a fixed local time (e.g. “run at 02:30 every day”) without accounting for DST. On the spring-forward day, 02:30 does not exist and the job will either be skipped or fire at an unintended time depending on the scheduler.

Go deeper: not all DST transitions are ±1 hour at 2 AM

The popular mental model — “clocks go forward one hour at 2 AM in spring” — holds for North America and most of Europe, but it is not universal:

  • Some zones transition by 30 minutes rather than 60 (e.g. Australia/Lord_Howe). (A 45-minute standing offset exists — Asia/Kathmandu, Pacific/Chatham — but no zone makes a 45-minute DST shift.)
  • Some transitions happen at midnight, noon, or other times.
  • Some regions have historically switched DST on and off in irregular ways (wartime, government changes).
  • A small number of zones have observed half-hour or quarter-hour offsets from UTC (e.g. Asia/Kolkata is +05:30, Australia/Lord_Howe shifts between +10:30 and +11:00).
  • Lord Howe Island’s transition is only 30 minutes, so the gap/overlap is only half an hour wide.

The only reliable source of truth is the IANA Time Zone Database, updated to reflect legislative changes. See also Time zones vs offsets for why storing the zone name — not just the offset — is necessary to handle these correctly.


← Back to all topics