datetime в связке с библиотекой pytz.  Основные шаги:
  datetime.datetime.now() или datetime.datetime.utcnow() (для UTC).pytz.timezone('Europe/Moscow') для создания объекта часового пояса.localize() к дате и времени без информации о часовом поясе (naive datetime) и передайте объект часового пояса.astimezone(), передав желаемый часовой пояс, для конвертации локализованной даты и времени.
  
  import datetime
  import pytz
  utc_now = datetime.datetime.utcnow()
  moscow_tz = pytz.timezone('Europe/Moscow')
  utc_now = pytz.utc.localize(utc_now)
  moscow_time = utc_now.astimezone(moscow_tz)
  print(f"UTC: {utc_now}")
  print(f"Moscow: {moscow_time}")
  
  
Для работы с датами и временем в разных часовых поясах в Python, необходимо использовать модуль datetime вместе с библиотекой pytz. pytz предоставляет доступ к базе данных часовых поясов IANA, что позволяет точно определять и преобразовывать даты и время между различными часовыми поясами.
Основные шаги:
pytz: Если у вас её нет, установите библиотеку pytz с помощью pip:
      pip install pytzdatetime:  Наивный объект не имеет информации о часовом поясе.
      import datetime
now_naive = datetime.datetime.now()
print(f"Наивное время: {now_naive}")tzinfo для часового пояса: Используйте pytz.timezone(), чтобы создать объект tzinfo, представляющий нужный часовой пояс.
      import pytz
timezone_moscow = pytz.timezone('Europe/Moscow')
timezone_utc = pytz.utc # Альтернативный вариант получения UTCdatetime: Используйте метод localize() объекта часового пояса, чтобы привязать наивный объект datetime к определенному часовому поясу. Это создает объект datetime, осведомленный (aware) о часовом поясе.
      now_aware_moscow = timezone_moscow.localize(now_naive)
print(f"Время в Москве: {now_aware_moscow}")astimezone(), чтобы преобразовать осведомленный объект datetime в другой часовой пояс.
      now_aware_utc = now_aware_moscow.astimezone(pytz.utc)
print(f"Время в UTC: {now_aware_utc}")datetime.datetime.now(timezone) или datetime.datetime.utcnow().replace(tzinfo=timezone).
      now_aware_ny = datetime.datetime.now(pytz.timezone('America/New_York'))
print(f"Время в Нью-Йорке: {now_aware_ny}")
utc_now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
print(f"Текущее время UTC (другой способ): {utc_now}")
      Пример полного кода:
import datetime
import pytz
# Получаем текущее наивное время
now_naive = datetime.datetime.now()
print(f"Наивное время: {now_naive}")
# Определяем часовые пояса
timezone_moscow = pytz.timezone('Europe/Moscow')
timezone_new_york = pytz.timezone('America/New_York')
timezone_utc = pytz.utc
# Локализуем наивное время в московском часовом поясе
now_aware_moscow = timezone_moscow.localize(now_naive)
print(f"Время в Москве: {now_aware_moscow}")
# Преобразуем время из московского в UTC
now_aware_utc = now_aware_moscow.astimezone(timezone_utc)
print(f"Время в UTC: {now_aware_utc}")
# Получаем текущее время сразу в Нью-Йорке
now_aware_ny = datetime.datetime.now(timezone_new_york)
print(f"Время в Нью-Йорке: {now_aware_ny}")
# Другой способ получить текущее время UTC
utc_now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
print(f"Текущее время UTC (другой способ): {utc_now}")
# Пример работы с датой, а не с датой и временем
date_naive = datetime.date(2024, 1, 1) # Создание наивной даты
date_aware_moscow = timezone_moscow.localize(datetime.datetime.combine(date_naive, datetime.time.min)).date() # Преобразование в aware date
print(f"Дата 1 января 2024 в Москве (aware): {date_aware_moscow}")
  Важно помнить: Всегда храните даты и время в UTC в базе данных. Преобразуйте их в локальное время только для отображения пользователю. Это позволит избежать проблем при изменении правил часовых поясов.
Полезные ресурсы: