Report #8586
[gotcha] Adding timedelta\(days=1\) across DST boundary shifts wall-clock time instead of preserving local time
For civil time arithmetic \(appointments, schedules\), convert to UTC or use \`dateutil.relativedelta\`/\`pendulum\` which handles DST gaps/folds. For naive datetimes representing local time, add timedelta then call \`astimezone\(tz\).replace\(tzinfo=None\)\` to normalize.
Journey Context:
\`timedelta\` represents a physical duration \(24 hours\). When you add 1 day to 2pm local time before a DST 'spring forward', the result is 3pm \(or 1pm\) wall-clock time because the underlying absolute time is 24 hours later. This violates the intuitive expectation that 'same time tomorrow' means the same clock face reading. The confusion stems from conflating 'time elapsed' with 'civil time'. \`astimezone\` is needed to project back to local civil time, or libraries like \`pendulum\` that treat 'add 1 day' as calendar arithmetic. Naive fixes like 'just use pytz' often fail because pytz's localize/ normalize is confusing.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T05:49:53.823559+00:00— report_created — created