dates.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from dataclasses import dataclass
  2. from datetime import datetime, timedelta
  3. import pytz
  4. timezone = pytz.timezone("Europe/Moscow")
  5. def is_actual_date(event_date: datetime) -> bool:
  6. """Проверяет, прошла ли уже дата"""
  7. now = datetime.now(timezone)
  8. return event_date.timestamp() > now.timestamp()
  9. def get_now_datetime_str() -> str:
  10. """Возвращает сегодняшний datetime с учётом времненной зоны."""
  11. now = datetime.now(timezone)
  12. return datetime2date_string(now)
  13. def parse_datetime_string(date_str: str, time_str: str) -> datetime:
  14. """
  15. Парсит строку с датой и временем и возвращает объект datetime
  16. """
  17. date_str = date_str.replace("/", "-").replace("\\", "").replace(".", "-")
  18. try:
  19. return datetime.strptime(
  20. f"{date_str} {time_str}", '%d-%m-%y %H:%M')
  21. except ValueError:
  22. raise ValueError("Вы ввели дату в неправильном формате\. \
  23. Попробуйте снова\. Дата: 12\-02\-22, 12\.02\.22 или 12/02/22\. Время: 22:22")
  24. @dataclass
  25. class NotificationDates:
  26. befor_day: str
  27. befor_4hours: str
  28. befor_5mins: str
  29. def compute_notification_dates(event_date: datetime):
  30. """
  31. По дате события рассчитывает даты напоминаний и возвращает их
  32. """
  33. befor_day = event_date - timedelta(days=1)
  34. befor_4hours = event_date - timedelta(hours=4)
  35. befor_5mins = event_date - timedelta(minutes=5)
  36. return NotificationDates(
  37. datetime2date_string(befor_day),
  38. datetime2date_string(befor_4hours),
  39. datetime2date_string(befor_5mins)
  40. )
  41. def datetime2date_string(date_time: datetime) -> str:
  42. """
  43. Преобразует объект datetime в строку нужного формата без секунд
  44. """
  45. return date_time.strftime("%Y-%m-%d %H:%M")