Конвертировать Python datetime в rfc 2822 - PullRequest
28 голосов
/ 11 августа 2010

Я хочу преобразовать дату и время Python в дату и время RFC 2822. Я пробовал эти методы безрезультатно:

>>> from email.Utils import formatdate
>>> import datetime
>>> formatdate(datetime.datetime.now())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/email    /utils.py", line 159, in formatdate
    now = time.gmtime(timeval)
TypeError: a float is required

Ответы [ 3 ]

38 голосов
/ 11 августа 2010

Вот некоторый рабочий код, разбитый на простые части для ясности:

>>> import datetime
>>> import time
>>> from email import utils
>>> nowdt = datetime.datetime.now()
>>> nowtuple = nowdt.timetuple()
>>> nowtimestamp = time.mktime(nowtuple)
>>> utils.formatdate(nowtimestamp)
'Tue, 10 Aug 2010 20:43:53 -0000'

Объяснение: email.utils.formatdate хочет метку времени - то есть, число с плавающей запятой с секундами (и их долями) начиная с эпохи. Экземпляр datetime не дает вам метку времени напрямую, но может дать вам кортеж с помощью метода timetuple, и, конечно, time.mktime может затем сделать метку такой кортеж.

25 голосов
/ 11 августа 2010

Если вы действительно хотите узнать текущее время, просто позвоните formatdate без аргументов:

>>> from email.Utils import formatdate
>>> formatdate()
'Tue, 10 Aug 2010 20:40:23 -0000'

Но, если вам нужно передать ему аргумент, вы хотите получить time.time (числосекунд с 01.01.1970):

>>> import time
>>> formatdate(time.time())
'Tue, 10 Aug 2010 20:41:43 -0000'

FWIW, datetime.datetime.now() возвращает объект datetime, который не соответствует ожиданиям formatdate.

Отредактировано для добавления:если у вас уже есть объект datetime, вы можете отформатировать его соответствующим образом для formatdate:

>>> import datetime
>>> dt = datetime.datetime.now()
>>> formatdate(float(dt.strftime('%s')))
'Tue, 10 Aug 2010 20:46:16 -0000'

Отредактировано: Алекс Мартелли отметил, что строка формата '% s' для strftime может не переноситься на разные платформы.Возможная альтернатива была бы, как он сам предложил,

>>> formatdate(time.mktime(dt.timetuple()))
'Tue, 10 Aug 2010 20:46:16 -0000'
8 голосов
/ 09 марта 2017

Python 3.3, помимо методов, упомянутых другими комментаторами, также добавил метод format_datetime, который намного чище:

...