Как преобразовать RFC822 в объект даты и времени Python?

Я знаю, как сделать это наоборот... это будет:

>>> dt.rfc822()
'Sun, 09 Mar 1997 13:45:00 -0500'

person Udbhav    schedule 14.10.2009    source источник


Ответы (3)



In [1]: import rfc822     # This only works for python 2 series

In [2]: rfc822.parsedate_tz('Sun, 09 Mar 1997 13:45:00 -0500')
Out[2]: (1997, 3, 9, 13, 45, 0, 0, 1, 0, -18000)

в python3 parsedate_tz переместился в email.utils


>>> import email.utils   # this works on Python2.5 and up
>>> email.utils.parsedate_tz('Sun, 09 Mar 1997 13:45:00 -0500')
(1997, 3, 9, 13, 45, 0, 0, 1, -1, -18000)
person John La Rooy    schedule 14.10.2009
comment
Я думал, что rf822 устарел? - person Udbhav; 15.10.2009
comment
Спасибо, исправил. Предупреждения об устаревании нет даже в 2.6 :( - person John La Rooy; 15.10.2009
comment
Приведенный выше метод возвращает не datetime, а tuple. Полный код datetime.datetime.fromtimestamp( email.utils.mktime_tz(email.utils.parsedate_tz( rfcdate )), pytz.utc ). Ссылка: parand.com/say/index.php/2008/02/11/ - person AppleGrew; 11.08.2012
comment
Продолжение комментария @AppleGrew: или с помощью модуля rfc822 datetime.datetime.fromtimestamp(rfc822.mktime_tz(rfc822.parsedate_tz(rfc822String))) - person theta; 10.07.2013
comment
В python 3 попробуйте email.utils.parsedate_to_datetime. - person Reece; 03.10.2013
comment
Утилиты электронной почты, похоже, RFC2822. это то же самое, что и 822? - person Thomas Ahle; 07.11.2013
comment
@ThomasAhle, модуль rfc822 предшествовал RFC2822. Оказывается, не лучшая идея называть модуль в честь RFC :) Это было исправлено в Python3. Текущий на самом деле RFC5322 - person John La Rooy; 08.11.2013
comment
Модуль rfc822 устарел уже в Python 2.3; документация указывает на email вместо пакета, который был представлен в Python 2.2. - person tripleee; 09.10.2014
comment
Вы можете немного упростить; есть метод utcfromtimestamp для дат в UTC: datetime.datetime.utcfromtimestamp(email.utils.mktime_tz(email.utils.parsedate_tz(rfcdate))) - person tripleee; 09.10.2014

Начиная с Python 3.3 существует email.utils.parsedate_to_datetime(дата)

>>> from email.utils import parsedate_to_datetime
>>> datestr = 'Sun, 09 Mar 1997 13:45:00 -0500'
>>> parsedate_to_datetime(datestr)
datetime.datetime(1997, 3, 9, 13, 45, tzinfo=datetime.timezone(datetime.timedelta(-1, 68400)))
person lod    schedule 08.08.2017

Если убрать часовой пояс, то сделать это можно так:

datetime.datetime.strptime('Sun, 09 Mar 1997 13:45:00', '%a, %d %b %Y %H:%M:%S')
person Daniel Roseman    schedule 14.10.2009
comment
Это не похоже на часовые пояса - person Thomas Ahle; 07.11.2013
comment
Он специально спросил, как это сделать для даты/времени rfc822. Поскольку rfc822 включает часовой пояс, ваш ответ не решает его. Хуже того, на самом деле он возвращает другое время, в зависимости от часового пояса, в котором был запущен код, и часового пояса, в котором была сгенерирована строка (которые в веб-приложениях могут сильно различаться). - person Dolf Andringa; 17.07.2017