Я думаю, что может быть проблема с модулем pytz/datetime в Python. Либо я неправильно его использую.
Пожалуйста, посмотрите код ниже, который подчеркивает проблемы, с которыми я в настоящее время сталкиваюсь. Я также привел краткий обзор двух проблем, которые я не могу решить на данный момент.
-
Первая проблема, с которой я сталкиваюсь, заключается в том, что модуль datetime в Python, похоже, считает, что в дату 1/4/2024 лондонское время отстает от UTC на 1 минуту! На самом деле 1/4/2024 лондонское время опережает UTC на 1 час, потому что в этом время Великобритания использует переход на летнее время.
-
Вторая проблема заключается в том, что метод ‘astimezone’ кажется неправильно конвертирует лондонское время полуночи 1/4/24 в 3 часа ночи 1/4/24 по восточноевропейскому времени (EET). Правильное конвертированное время должно быть 2 часа ночи 1/4/2024.
Есть ли ошибка в модуле datetime/pytz Python или я допустил простую ошибку где-то?
Код:
from datetime import datetime
import pytz
# 1) Создание и вывод объекта datetime для даты 1/4/2024 в лондонском часовом поясе
lndn_timezone=pytz.timezone("Europe/London")
lndn_datetime=datetime(2024,4,1,0,0,0,tzinfo=lndn_timezone)
print(lndn_datetime) # Это показывает, что lndn_datetime отстает на 1 минуту от UTC. Почему? Лондонское время 1/4/2024 должно быть UTC+01:00. А не UTC-00:01, как показано.
# 2) Конвертация lndn_datetime в datetime в EET (восточноевропейский часовой пояс) и отображение результата.
eet_timezone=pytz.timezone("EET")
eet_datetime=lndn_datetime.astimezone(eet_timezone)
print(eet_datetime) # Это неправильно конвертировало лондонское время в часовой пояс EET. Результат должен быть 1/4/2024 в 2 часа ночи. А не 3 часа, как показано.
Ответ
Ваши проблемы связаны с неправильным использованием модуля pytz
и создания объектов datetime
. Давайте разберем ваши вопросы по порядку и исправим ошибки в вашем коде.
Проблема 1: Лондонское время на 1/4/2024
Ваша проблема заключается в том, как вы создаете объект datetime
. Когда вы вызываете datetime
и передаете tzinfo
, вы не используете правильный механизм, который предоставляет pytz
для установки временной зоны. Вместо этого вам нужно сначала создать объект datetime
, а затем использовать метод localize
из pytz
для назначения временной зоны. Вот исправленный код:
from datetime import datetime
import pytz
# 1) Создание объекта datetime для даты 1/4/2024 в лондонской временной зоне
lndn_timezone = pytz.timezone("Europe/London")
naive_datetime = datetime(2024, 4, 1, 0, 0, 0) # без указания временной зоны
lndn_datetime = lndn_timezone.localize(naive_datetime)
print(lndn_datetime) # Теперь это покажет правильное время: 1 час впереди UTC (UTC+01:00)
Проблема 2: Конвертация во временную зону EET
Теперь, когда у нас есть правильный объект lndn_datetime
, давайте посмотрим на второй вопрос. Для правильного преобразования во временную зону EET вы по-прежнему используете метод astimezone
, но теперь на правильном объекте:
# 2) Преобразование lndn_datetime в datetime в EET (восточноевропейское время) и вывод результата.
eet_timezone = pytz.timezone("EET")
eet_datetime = lndn_datetime.astimezone(eet_timezone)
print(eet_datetime) # Это должно правильно вернуть 1/4/2024 в 2am (а не 3am)
Заключение
Таким образом, проблема была не в модуле pytz
, а в том, как вы использовали его для создания временных объектов. Обязательно используйте localize
, чтобы правильно установить временную зону для datetime
. После внесения этих изменений ваш код должен работать правильно.
Попробуйте запустить исправленный код, и он должен дать ожидаемые результаты.