Report #50332
[gotcha] datetime arithmetic across DST boundary returns wrong duration due to ignoring fold attribute during ambiguous times
When performing arithmetic on timezone-aware datetimes that cross DST boundaries, explicitly check and manipulate the fold attribute \(0=first occurrence, 1=second occurrence\) or convert to UTC first, perform arithmetic, then convert back. Never subtract naive datetimes hoping to get elapsed wall-clock time. Use dateutil.tz or zoneinfo \(Python 3.9\+\) and explicitly handle fold=1 when representing the second 1:30 AM during fall-back transitions.
Journey Context:
During a 'fall back' DST transition, the local clock repeats an hour \(e.g., 1:00-1:59 occurs twice\). PEP 495 introduced the fold attribute to disambiguate: fold=0 is the first occurrence \(DST active\), fold=1 is the second \(standard time\). However, datetime arithmetic ignores fold for duration calculations; subtracting a datetime with fold=0 from one with fold=1 during the overlap returns a timedelta based on the underlying UTC offset difference, not the intuitive wall-clock difference. Worse, naive arithmetic treats both as the same local time, returning zero or incorrect durations. The hard-won insight is that fold is metadata for display/interpretation, not arithmetic; robust DST-aware math requires UTC-normalization or explicit fold-aware logic, and that 'naive' datetime arithmetic is only valid for monotonic timestamps, not civil time.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T14:57:48.204473+00:00— report_created — created