2017-02-02 8 views
8

У меня есть следующая строка "2017-03-30 08:25:00CET", которую я хочу преобразовать в объект dtetime tz-aware.datetime: преобразование из строки с именем часового пояса не работает

Согласно this SO question, из python 3.2 это можно сделать, используя только datetime модуль. Кроме того, из documentation, я вижу

%z | UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). | (empty), +0000, -0400, +1030 
%Z | Time zone name (empty string if the object is naive).      | (empty), UTC, EST, CST 

Так что попробуйте следующее

datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%Z') 

Я не получаю сообщение об ошибке, но тогда объект я не TZ-Aware

datetime.datetime(2017, 3, 30, 8, 25) 

С другой стороны, если я преобразую свою строку в "2017-03-30 08:25:00+0200", а затем преобразую ее в объект с

datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%z')

Я получаю TZ-Aware DateTime:

datetime.datetime(2017, 3, 30, 8, 25, tzinfo=datetime.timezone(datetime.timedelta(0, 7200))) 

Любые идеи о том, почему он работает с %z, но не с %Z? Что я делаю не так?

+0

Соответствующие для вас: http://stackoverflow.com/questions/1703546/parsing-date-time-string-with-timezone -abbreviated-name-in-python http://stackoverflow.com/questions/3305413/python-strptime-and-timezones. Названия часовых поясов (например, 'cet') неоднозначны. Ваш второй пример работает, потому что вы специально даете смещение часовой пояс '+ 0200'. используйте синтаксический анализатор в течение даты или вручную укажите часовой пояс с помощью tzinfo(). – Chuck

+1

Использование Python 3.6, я получаю данные «ValueError: time» 2017-03-30 08: 25: 00CET «не соответствует формату»% Y-% m-% d% H:% M:% S% Z'' от выполнения 'datetime.strptime (« 2017-03-30 08: 25: 00CET »,«% Y-% m-% d% H:% M:% S% Z ') ', что отличается от того, что вы говорите. – martineau

+0

@CharlesMorris, спасибо за ссылки. Я нашел 2-й особенно интересный. Для меня не имеет смысла, что в документации дается возможность использовать имена часовых поясов, но тогда это не работает, потому что это неоднозначно. – J0ANMM

ответ

4

Судя по информации, приведенной tzinfo, %Z не работает так, как вы кормите строку, например "UTC", и она вернет экземпляр datetime с правильным часовым поясом.

pytz предлагает возможное решение вашей проблемы. Однако в документации говорится, что нет никакой гарантии того, что ваш часовой пояс будет распознан datetime и рекомендует работать с UTC как можно дольше.

Решение с использованием pytz:

from datetime import datetime 
from pytz import timezone 
dep_dt = '2017-03-30 08:25:00CET' 
dt = datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%Z') 
timezone(dep_dt[19:]).localize(dt) 

Out:

datetime.datetime(2017, 3, 30, 8, 25, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>) 
+0

Означает ли это, что документация из 'datetime' просто неверна? – J0ANMM

+0

По крайней мере, это не очень понятно. Существует примечание, объясняющее поведение, но это не дает мне понять, по моему мнению: «% Z Если tzname() возвращает None,% Z заменяется пустой строкой. В противном случае% Z заменяется возвращаемым значением , который должен быть строкой. Изменено в версии 3.2: Когда директива% z предоставляется методу strptime(), будет создан объект осведомленного объекта datetime. Значение tzinfo результата будет установлено в экземпляр временной зоны « – UpSampler

+0

Я добавил решение с помощью pytz сейчас. – UpSampler

 Смежные вопросы

  • Нет связанных вопросов^_^