from __future__ import annotations from datetime import datetime, timezone from zoneinfo import ZoneInfo, ZoneInfoNotFoundError DEFAULT_TIMEZONE = "Asia/Shanghai" DATETIME_DISPLAY_FORMAT = "%Y-%m-%d %H:%M:%S" def utc_now() -> datetime: return datetime.now(timezone.utc).replace(tzinfo=None) def current_year_for_timezone(timezone_name: str | None) -> int: return datetime.now(timezone.utc).astimezone(timezone_for_name(timezone_name)).year def timezone_for_name(name: str | None) -> ZoneInfo: try: return ZoneInfo((name or DEFAULT_TIMEZONE).strip() or DEFAULT_TIMEZONE) except ZoneInfoNotFoundError: return ZoneInfo(DEFAULT_TIMEZONE) def format_datetime_for_timezone(value: datetime | None, timezone_name: str | None) -> str: if value is None: return "-" if value.tzinfo is None: value = value.replace(tzinfo=timezone.utc) return value.astimezone(timezone_for_name(timezone_name)).strftime(DATETIME_DISPLAY_FORMAT)