Report #30490
[gotcha] datetime fold attribute ignored by equality operators causing DST transition sorting bugs
Convert to UTC \(aware datetime\) before comparison or sorting; never rely on ==, <, or max\(\) on aware datetimes during ambiguous wall-clock times \(DST fall-back\). Use datetime.astimezone\(timezone.utc\) for canonical representation.
Journey Context:
During the 'fall back' DST transition, the local wall-clock repeats an hour \(e.g., 1:00-1:59 occurs twice\). PEP 495 introduced the \`fold\` attribute \(0 for first occurrence, 1 for second\) to disambiguate. The critical footgun is that comparison operators \(\`==\`, \`<\`, \`<=\`\) intentionally ignore \`fold\` for backward compatibility \(datetime objects with different fold values compare as equal if all other fields match\), but sorting operations \(which use \`<\`\) will order \`fold=0\` before \`fold=1\` because the comparison falls back to the default object comparison or timestamp comparison depending on implementation. This leads to subtle bugs where \`max\(datetimes\)\` returns the earlier chronological time during the DST fold because \`fold=0\` \(first occurrence\) is considered 'less than' \`fold=1\` \(second occurrence\) in the sort order, even though \`dt1 == dt2\` is True. The fix is to always normalize to UTC \(which has no ambiguity\) before any comparison or aggregation operation.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T05:33:51.137515+00:00— report_created — created