Для работы с международными данными, комбинируя объекты datetime с временными зонами в Python, необходимо использовать модуль pytz или встроенный в Python 3.9+ zoneinfo, а также модуль datetime.
Основные шаги и пояснения:
import datetime
import pytz # Или from zoneinfo import ZoneInfo, если Python 3.9+
Наивный datetime объект - это объект datetime, не содержащий информации о временной зоне. Пример:
naive_datetime = datetime.datetime.now()
print(f"Наивный datetime: {naive_datetime}")Чтобы присвоить временную зону наивному datetime объекту, используем метод localize() (для pytz) или replace(tzinfo=...) (для zoneinfo). Важно знать целевую временную зону.
Пример с pytz:
import pytz
import datetime
naive_datetime = datetime.datetime.now()
timezone = pytz.timezone('Europe/Moscow') # Выбираем нужную временную зону
aware_datetime = timezone.localize(naive_datetime) # Локализуем datetime
print(f"Datetime с временной зоной (pytz): {aware_datetime}")
print(f"Временная зона: {aware_datetime.tzinfo}")
Пример с zoneinfo (Python 3.9+):
from datetime import datetime
from zoneinfo import ZoneInfo
naive_datetime = datetime.now()
timezone = ZoneInfo("America/Los_Angeles") # Выбираем нужную временную зону
aware_datetime = naive_datetime.replace(tzinfo=timezone)
print(f"Datetime с временной зоной (zoneinfo): {aware_datetime}")
print(f"Временная зона: {aware_datetime.tzinfo}")
Для конвертации datetime объекта между временными зонами используется метод astimezone().  Сначала у вас должен быть aware datetime объект.
Пример с pytz:
import pytz
import datetime
naive_datetime = datetime.datetime.now()
moscow_tz = pytz.timezone('Europe/Moscow')
aware_datetime_moscow = moscow_tz.localize(naive_datetime)
new_york_tz = pytz.timezone('America/New_York')
aware_datetime_new_york = aware_datetime_moscow.astimezone(new_york_tz)
print(f"Datetime в Москве: {aware_datetime_moscow}")
print(f"Datetime в Нью-Йорке: {aware_datetime_new_york}")Пример с zoneinfo (Python 3.9+):
from datetime import datetime
from zoneinfo import ZoneInfo
naive_datetime = datetime.now()
moscow_tz = ZoneInfo("Europe/Moscow")
aware_datetime_moscow = naive_datetime.replace(tzinfo=moscow_tz)
new_york_tz = ZoneInfo("America/New_York")
aware_datetime_new_york = aware_datetime_moscow.astimezone(new_york_tz)
print(f"Datetime в Москве: {aware_datetime_moscow}")
print(f"Datetime в Нью-Йорке: {aware_datetime_new_york}")
Часто бывает полезно хранить время в UTC (Coordinated Universal Time).  pytz предоставляет utc временную зону, а zoneinfo просто использует timezone.utc.
Пример с pytz:
import pytz
import datetime
naive_datetime = datetime.datetime.now()
local_tz = pytz.timezone('Europe/London')
aware_datetime_local = local_tz.localize(naive_datetime)
utc_datetime = aware_datetime_local.astimezone(pytz.utc)
print(f"Местное время (Лондон): {aware_datetime_local}")
print(f"Время в UTC: {utc_datetime}")
Пример с zoneinfo (Python 3.9+):
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
naive_datetime = datetime.now()
local_tz = ZoneInfo("Europe/London")
aware_datetime_local = naive_datetime.replace(tzinfo=local_tz)
utc_datetime = aware_datetime_local.astimezone(timezone.utc)
print(f"Местное время (Лондон): {aware_datetime_local}")
print(f"Время в UTC: {utc_datetime}")
При работе с временными зонами (особенно при локализации) могут возникать исключения, например, pytz.exceptions.AmbiguousTimeError или pytz.exceptions.NonExistentTimeError. Важно обрабатывать их, чтобы обеспечить стабильность работы программы. Эти исключения возникают, когда время попадает на период перехода на летнее/зимнее время, и может быть неясно, к какому из периодов относится время.
Важные замечания:
pytz - это зрелая и широко используемая библиотека. Начиная с Python 3.9, zoneinfo включена в стандартную библиотеку, что делает ее более предпочтительным вариантом, если вы разрабатываете для Python 3.9 и выше.pytz и zoneinfo используют базу данных IANA time zone database, которая регулярно обновляется. Убедитесь, что ваша система имеет актуальную версию базы данных.В целом, комбинация модулей datetime, pytz (или zoneinfo) и правильное понимание концепций временных зон позволяет эффективно работать с международными данными в Python.