22 lines
658 B
Python
22 lines
658 B
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
|
|
def utc_now() -> datetime:
|
|
return datetime.now(timezone.utc)
|
|
|
|
|
|
def ensure_aware_utc(value: datetime | None) -> datetime | None:
|
|
"""Return a timezone-aware UTC datetime.
|
|
|
|
SQLite and some DB drivers may return naive datetimes even when SQLAlchemy
|
|
columns are declared as DateTime(timezone=True). Treat naive values as UTC
|
|
so comparisons with aware `datetime.now(timezone.utc)` do not crash.
|
|
"""
|
|
if value is None:
|
|
return None
|
|
if value.tzinfo is None:
|
|
return value.replace(tzinfo=timezone.utc)
|
|
return value.astimezone(timezone.utc)
|