32 lines
986 B
Python
32 lines
986 B
Python
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)
|