30 lines
1.2 KiB
Python
30 lines
1.2 KiB
Python
"""Работа со временем: хранение в UTC, отдача ISO с явным смещением,
|
|
«сегодня» в часовом поясе приложения (по умолчанию +3)."""
|
|
from __future__ import annotations
|
|
|
|
from datetime import date, datetime, timedelta, timezone
|
|
|
|
from app.core.config import settings
|
|
|
|
APP_TZ = timezone(timedelta(hours=settings.app_tz_offset_hours))
|
|
|
|
|
|
def utcnow() -> datetime:
|
|
"""Текущее время в UTC (aware)."""
|
|
return datetime.now(timezone.utc)
|
|
|
|
|
|
def app_today() -> date:
|
|
"""Текущая дата в часовом поясе приложения (для «даты игры»)."""
|
|
return datetime.now(APP_TZ).date()
|
|
|
|
|
|
def iso_utc(dt: datetime | None) -> str | None:
|
|
"""ISO-строка с явным UTC-смещением. Наивное значение из SQLite считаем UTC,
|
|
чтобы фронт корректно сконвертировал его в локальный пояс отображения."""
|
|
if dt is None:
|
|
return None
|
|
if dt.tzinfo is None:
|
|
dt = dt.replace(tzinfo=timezone.utc)
|
|
return dt.astimezone(timezone.utc).isoformat()
|