dateutil.parser
добавит часовой пояс тогда и только тогда, когда он его найдет, что может зависеть от настроек часового пояса вашего локального компьютера, потому что, если он обнаружит сокращенный часовой пояс, такой как "EST", который находится в списке аббревиатуры для вашего местного часового пояса, он будет считать, что это тот, который вы имеете в виду.
Тем не менее, это не то, что происходит в этом случае. Даже если parser
прикреплял часовой пояс, datetime.replace
выполняет полную замену часового пояса, а не преобразование. Я не думаю, что в вашем вопросе достаточно информации для полной диагностики этой проблемы, но если timezone()
равно pytz.timezone()
, по крайней мере одна из ваших проблем заключается в том, что pytz
часовые пояса не могут быть привязаны к datetime
объектам с replace
. Вместо этого вам нужно будет использовать datetime_obj = pytz.timezone(tz_code).localize(datetime_obj)
.
Обратите внимание, что метод localize
предполагает, что у вас есть объект, не зависящий от часового пояса, поэтому он выдаст ошибку, если синтаксический анализатор datetutil
вернет datetime
с учетом часового пояса, поэтому вы должны передать ignoretz=True
синтаксическому анализатору, чтобы предотвратить это.
Тем не менее, даже после того, как вы это сделаете, реальная проблема заключается в том, как вы используете time.mktime
. См. этот ответ, который точно такая же проблема. Подводя итог этому ответу, лучше всего использовать calendar.timegm
вместо mktime
и преобразовать в UTC перед его вызовом. Включая мои предложения, вот обновленная версия вашего кода:
import calendar
from dateutil.tz import tzutc
def parse_date(datetime_string, tz_code):
tz = timezone(tz_code)
datetime_obj = parser.parse(datetime_string, ignoretz=True)
datetime_obj_localized = tz.localize(datetime_obj)
datetime_obj_utc = datetime_obj_localized.astimezone(tzutc())
return calendar.timegm(datetime_obj_utc.timetuple())
person
Paul
schedule
16.10.2016