"""Работа со временем: хранение в 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()