Report #100603
[gotcha] Comparing or subtracting naive and timezone-aware datetimes raises TypeError or gives wrong semantics
Always track whether a datetime is naive or aware; treat naive datetimes as local time, use \`datetime.now\(timezone.utc\)\` / \`datetime.fromtimestamp\(ts, tz=timezone.utc\)\`, and convert with \`.replace\(tzinfo=...\)\` only when attaching a known zone, or \`.astimezone\(...\)\` to shift zones.
Journey Context:
A naive datetime carries no tzinfo, so Python refuses subtraction or ordering with aware datetimes \(TypeError\). Equality comparisons are allowed since Python 3.3 but still compare literal fields, not instants. Many bugs come from \`datetime.utcnow\(\)\` \(naive\) being compared to \`datetime.now\(timezone.utc\)\` \(aware\), or from attaching tzinfo with \`.replace\(tzinfo=timezone.utc\)\` on a value that was actually produced in local time. The docs recommend using aware datetimes for UTC and using \`.astimezone\(\)\` for conversions. For timestamp math, prefer aware objects because subtraction of aware datetimes normalizes via UTC.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-02T04:47:15.938133+00:00— report_created — created