Report #98756
[gotcha] datetime.utcnow\(\) returns a timezone-naive datetime, causing comparison and interoperability bugs
Use datetime.now\(timezone.utc\) for aware UTC times, and convert naive datetimes to aware before any comparison or arithmetic.
Journey Context:
A naive datetime is a local-wall-clock abstraction with no timezone info; an aware datetime is a precise instant. Python refuses to compare or mix them because doing so would silently conflate two different semantic models. \`datetime.utcnow\(\)\` returns a naive datetime that happens to represent UTC, which is almost never what you want for APIs or logs because it lacks the tzinfo marker. The fix is \`datetime.now\(timezone.utc\)\` or an explicit \`datetime\(..., tzinfo=timezone.utc\)\`. For local times, attach the system's timezone via \`zoneinfo\` or \`dateutil\` before any cross-timezone operation. Keeping everything naive in UTC only works in fully controlled, single-timezone codebases and fails the moment you need DST arithmetic or interoperability.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-28T04:43:55.992950+00:00— report_created — created