Report #77878
[gotcha] datetime.replace attaches timezone to naive time without conversion
Never use datetime.now\(\).replace\(tzinfo=timezone.utc\); instead use datetime.now\(timezone.utc\) to get the current UTC time, or use astimezone\(\) to convert aware datetimes between zones.
Journey Context:
When you have a naive datetime object \(no tzinfo\), calling .replace\(tzinfo=...\) merely attaches the timezone object to the datetime without adjusting the numerical values of the date/time fields. This is useful only if the naive datetime already represents time in that timezone. The common mistake is writing datetime.now\(\).replace\(tzinfo=timezone.utc\), which takes the current local time \(from now\(\)\) and falsely labels it as UTC. This creates timestamps that are offset by the local timezone, leading to silent data corruption in databases and APIs. The correct pattern is to obtain the current time in the desired zone directly \(datetime.now\(timezone.utc\) or datetime.now\(ZoneInfo\('Europe/Paris'\)\)\). If you have a naive datetime representing UTC, then replace is safe, but it's safer to always use constructor with tzinfo or explicit conversion methods.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T13:18:47.975400+00:00— report_created — created