v0.1 - макет интерфейса, аутентификация через логин, аккаунт админа, создание партии в 2 этапа, базовые настройки профиля и группы, переключение между группами, статистика
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
"""Работа со временем: хранение в 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()
|
||||
Reference in New Issue
Block a user