Report #102992
[gotcha] datetime.replace\(tzinfo=...\) changes the timezone label but does not convert the wall-clock time
Use \`astimezone\(...\)\` to convert an aware datetime to another timezone; only use \`replace\(tzinfo=...\)\` when you are explicitly attaching a timezone to a naive value that you already know represents that zone's local time.
Journey Context:
A naive datetime is a plain \`\(year, month, day, hour, ...\)\` tuple. Calling \`.replace\(tzinfo=...\)\` mutates only the metadata: it says "this naive wall-clock value should now be interpreted as belonging to zone X" without shifting the numbers. In contrast, \`astimezone\(\)\` performs the actual conversion by comparing UTC offsets and adjusting the wall-clock components. The bug usually appears when someone fetches a UTC timestamp, attaches \`.replace\(tzinfo=timezone.utc\)\`, then tries \`.astimezone\(local\)\` and is surprised it is correct, but later does \`.replace\(tzinfo=local\)\` and gets a completely wrong clock time. The rule is: \`replace\` for labeling, \`astimezone\` for converting.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-10T04:49:52.476460+00:00— report_created — created