Является ли модуль python datetime/pytz неисправным или я допустил простую ошибку где-то?

Вопросы и ответы

Я думаю, что может быть проблема с модулем pytz/datetime в Python. Либо я неправильно его использую.

Пожалуйста, посмотрите код ниже, который подчеркивает проблемы, с которыми я в настоящее время сталкиваюсь. Я также привел краткий обзор двух проблем, которые я не могу решить на данный момент.

  1. Первая проблема, с которой я сталкиваюсь, заключается в том, что модуль datetime в Python, похоже, считает, что в дату 1/4/2024 лондонское время отстает от UTC на 1 минуту! На самом деле 1/4/2024 лондонское время опережает UTC на 1 час, потому что в этом время Великобритания использует переход на летнее время.

  2. Вторая проблема заключается в том, что метод ‘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. После внесения этих изменений ваш код должен работать правильно.

Попробуйте запустить исправленный код, и он должен дать ожидаемые результаты.

Оцените материал
Добавить комментарий

Капча загружается...