41 lines
1.5 KiB
Python
41 lines
1.5 KiB
Python
# timezone_utils.py
|
|
from datetime import datetime, timedelta
|
|
import pytz
|
|
|
|
# Часовой пояс Екатеринбурга (UTC+5)
|
|
TARGET_TIMEZONE = "Asia/Yekaterinburg"
|
|
|
|
def get_current_time():
|
|
"""Возвращает текущее время в Екатеринбурге"""
|
|
tz = pytz.timezone(TARGET_TIMEZONE)
|
|
return datetime.now(tz)
|
|
|
|
def format_time(dt: datetime = None, format_str: str = "%Y-%m-%d %H:%M:%S"):
|
|
"""Форматирует время для вывода"""
|
|
if dt is None:
|
|
dt = get_current_time()
|
|
return dt.strftime(format_str)
|
|
|
|
def parse_time_to_utc(dt: datetime):
|
|
"""Преобразует локальное время (Екатеринбург) в UTC для хранения в БД"""
|
|
if dt.tzinfo is None:
|
|
# Если время без часового пояса, добавляем Екатеринбург
|
|
tz = pytz.timezone(TARGET_TIMEZONE)
|
|
dt = tz.localize(dt)
|
|
return dt.astimezone(pytz.UTC)
|
|
|
|
def parse_time_from_utc(utc_time_str: str):
|
|
"""Преобразует UTC строку из БД в время Екатеринбурга"""
|
|
if not utc_time_str:
|
|
return None
|
|
try:
|
|
# Парсим UTC время
|
|
utc_time = datetime.fromisoformat(utc_time_str)
|
|
if utc_time.tzinfo is None:
|
|
utc_time = pytz.UTC.localize(utc_time)
|
|
# Конвертируем в Екатеринбург
|
|
tz = pytz.timezone(TARGET_TIMEZONE)
|
|
return utc_time.astimezone(tz)
|
|
except Exception:
|
|
return None
|