from datetime import UTC, datetime
def utc_now() -> datetime:
return datetime.now(UTC)
def ensure_aware_utc(value: datetime) -> datetime:
if value.tzinfo is None or value.utcoffset() is None:
raise ValueError("naive datetime is not allowed")
return value.astimezone(UTC)
def iso(value: datetime | None) -> str | None:
if value is None:
return None
return ensure_aware_utc(value).isoformat().replace("+00:00", "Z")
def parse_iso(value: str | None) -> datetime | None:
if value is None:
return None
parsed = datetime.fromisoformat(value)
return ensure_aware_utc(parsed)