Подтвердить что ты не робот

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(), не зная времени локали?

4b9b3361

Ответ 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)