Report #82095
[gotcha] datetime.replace\(tzinfo=...\) creates invalid wall-clock times instead of converting timezones
Never use dt.replace\(tzinfo=zone\) to convert timezones; always use dt.astimezone\(tz\) which adjusts the clock time and correctly handles DST transitions, ambiguous times \(fold\), and gaps
Journey Context:
A naive datetime represents a wall-clock time without zone information. When developers want to treat that 9:00 AM as 9:00 AM Eastern, they often call dt.replace\(tzinfo=zoneinfo.ZoneInfo\('America/New\_York'\)\). This operation merely attaches the timezone label without adjusting the underlying timestamp. If the naive time was originally in UTC or another zone, this creates a logically incorrect instant. Worse, if the wall-clock time falls in a DST gap \(spring forward\) or ambiguous period \(fall back\), replace\(\) provides no mechanism to specify which side of the fold the time belongs to, resulting in potentially non-existent or ambiguous datetimes. The correct method is astimezone\(\), which computes the equivalent UTC timestamp for the given wall-clock time in the source zone, then converts that instant to the target zone, yielding the correct wall-clock time and handling fold explicitly via the fold attribute.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T20:23:25.163491+00:00— report_created — created