/
artyuhovs
/
AIFeedBackTrainingBot
Обзор
Документация
Войти
/
artyuhovs
/
AIFeedBackTrainingBot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/utils/time_utils.py
46 строк
1 KB
Codex
Завершить архитектурное оздоровление и исправить итоги
15 июл 2026, 11:05
15 июл 2026, 11:05
c65f9a6
Код
Авторство
О чём код?
from __future__ import annotations from dataclasses import dataclass from datetime import UTC, datetime, timedelta from typing import Protocol class Clock(Protocol): def now(self) -> datetime: ... class SystemClock: def now(self) -> datetime: return datetime.now(UTC) @dataclass class FrozenClock: current: datetime def __post_init__(self) -> None: if self.current.tzinfo is None: raise ValueError("FrozenClock requires a timezone-aware datetime") def now(self) -> datetime: return self.current def set(self, value: datetime) -> None: if value.tzinfo is None: raise ValueError("FrozenClock requires a timezone-aware datetime") self.current = value def advance(self, delta: timedelta) -> None: self.current += delta def now_iso(clock: Clock | None = None) -> str: return (clock or SystemClock()).now().isoformat() def format_user_datetime(value: str | datetime | None, fallback: str = "не указано") -> str: """Format a stored ISO timestamp for user-facing messages.""" if value is None or value == "": return fallback parsed = value if isinstance(value, datetime) else datetime.fromisoformat(str(value)) return parsed.strftime("%Y-%m-%d %H:%M")