Python timezone '% z' директива для datetime.strptime() недоступна
Использование шаблона '% z' для datetime.strptime()
У меня есть строковый текст, который представляет дату, и я отлично разбираюсь в нем и преобразую его в чистый объект datetime:
date = "[24/Aug/2014:17:57:26"
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S")
За исключением того, что я не могу поймать всю строку даты с часовым поясом, используя шаблон% z, как указано здесь
date_tz = 24/Aug/2014:17:57:26 +0200
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S %z]")
>>> ValueError: 'z' is a bad directive in format '[%d/%b/%Y:%H:%M:%S %z]'
Потому что этот отчет об ошибках говорит
strftime() реализовано на платформу
Я точно знаю, что такой проблемы нет с наивной директивой tzinfo '% Z'
Обходной путь: литье строки tzinfo в объект tzinfo
Я могу отлично сделать следующее обходное решение, преобразуя строку формата времени GST в объект tzinfo [как предлагается здесь] [4], используя dateutil модуль
а затем вставьте tzinfo в объект datetime
Вопрос: Сделать% z доступным для моей формы?
Но поскольку мне, очевидно, понадобится шаблон% z для дальнейшего проекта, я бы хотел найти решение, чтобы избежать этого обходного пути и использовать внешний модуль для этой простой задачи.
Можете ли вы предложить мне кое-что прочитать? Я предположил, что более новая версия python (я на 2,7) может справиться с этим, но я бы предпочел не менять мою версию сейчас для этой небольшой, но важной детали.
[EDIT]
Хорошо, увидев комментарии, я переформулировал свой вопрос о том, как анализировать индикатор часового пояса электронной почты, используя strptime(), не зная времени локали?
Ответы
Ответ 1
strptime()
реализован в чистом Python. В отличие от strftime()
; он [какие директивы поддерживаются] не зависит от платформы. %z
поддерживается с Python 3.2:
>>> from datetime import datetime
>>> datetime.strptime('24/Aug/2014:17:57:26 +0200', '%d/%b/%Y:%H:%M:%S %z')
datetime.datetime(2014, 8, 24, 17, 57, 26, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))
как разобрать индикатор часового пояса электронной почты, используя strptime(), не зная времени локали?
В Python 2.7 нет конкретной реализации часового пояса. Вы можете легко реализовать парсинг смещения UTC, см. Как анализировать даты с -0400 строки часового пояса в python?
Ответ 2
В продолжении @j-f-sebastians ответьте, вот исправление для python 2.7
Вместо использования:
datetime.strptime(t,'%Y-%m-%dT%H:%M %z')
используйте timedelta
для учета часового пояса, например:
from datetime import datetime,timedelta
def dt_parse(t):
ret = datetime.strptime(t[0:16],'%Y-%m-%dT%H:%M')
if t[18]=='+':
ret-=timedelta(hours=int(t[19:22]),minutes=int(t[23:]))
elif t[18]=='-':
ret+=timedelta(hours=int(t[19:22]),minutes=int(t[23:]))
return ret
Ответ 3
Ответ Ури велик, спас мне жизнь, но когда у тебя есть
USE_TZ = True
вам нужно быть осторожным с временем, чтобы избежать предупреждения "RuntimeWarning: DateTimeField" лучше, если вы добавите utc в return.
import pytz
from datetime import datetime, timedelta
def dt_parse(t):
ret = datetime.strptime(t[0:19],'%Y-%m-%dT%H:%M:%S')
if t[23]=='+':
ret-=timedelta(hours=int(t[24:26]), minutes=int(t[27:]))
elif t[23]=='-':
ret+=timedelta(hours=int(t[24:26]), minutes=int(t[27:]))
return ret.replace(tzinfo=pytz.UTC)