Преобразование даты и времени Python в rfc 2822

Я хочу преобразовать дату и время 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

person Adam Nelson    schedule 10.08.2010    source источник


Ответы (4)


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

>>> 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, конечно, может затем сделать метку времени из такого кортежа.

EDIT: в Python 3.3 и новее вы можете сделать то же самое за меньшее количество шагов:

>>> import datetime
>>> import time
>>> from email import utils
>>> nowdt = datetime.datetime.now()
>>> utils.format_datetime(nowdt)
'Tue, 10 Feb 2020 10:06:53 -0000'

Подробнее об использовании см. в format_datetime документах.

person Alex Martelli    schedule 10.08.2010
comment
почему бы просто не использовать time.time() ? - person Zhuo.M; 16.01.2015
comment
В версии 3.3 datetime получил метод timestamp, что значительно ускорило этот процесс. - person Berislav Lopac; 11.09.2015
comment
в Python 3.3 email.utils получил метод format_datetime(), который упрощает этот процесс: docs.python.org/3/library/ - person Abgan; 10.02.2020

Если вам действительно нужно текущее время, просто вызовите 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'
person rbp    schedule 10.08.2010
comment
Интересно - формат '%s' в strftime кажется недокументированным, и, таким образом, один из тех, которые работают на некоторых платформах (но не на всех) - если у вас нет документов, которые показывают, что он будет работать кроссплатформенно? - person Alex Martelli; 11.08.2010
comment
На самом деле, это строка формата, которую команда даты Unix использует для вывода времени на основе эпохи, я использовал ее, не задумываясь, и это сработало :) Я проверю и свяжусь с вами (или изменю свой ответ). - person rbp; 11.08.2010
comment
Итак, docs.python.org/library/ утверждает, что Полный набор поддерживаемых кодов форматов зависит от платформы, потому что Python вызывает функцию strftime() из библиотеки C платформы, и вариации платформы распространены. А в Linux man 3 strftime перечисляет '%s' как возможное значение формата. Так что я полагаю, вы правы, это, вероятно, не будет портативным. Спасибо :) - person rbp; 11.08.2010
comment
Это не переносимо - в Windows (Python 2.7) '%s'не работает: ValueError: Invalid format string - person theta; 31.05.2012
comment
@theta ты прочитал мой полный ответ? Последний абзац и блок кода относятся именно к этому. - person rbp; 31.05.2012
comment
Да, я знаю, но поскольку никто не подтвердил, я заметил, что в Windows '%s' не работает ;) - person theta; 31.05.2012

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

>>> import datetime
>>> import email.utils
>>> dt = datetime.datetime.now()
>>> email.utils.format_datetime(dt)
'Thu, 09 Mar 2017 10:50:00 -0000'
person FauxFaux    schedule 09.03.2017

Простой метод с использованием strftime. Питон 2.7. Примечание: часовой пояс = EST

>>> from datetime import datetime
>>> my_date = datetime.now()
>>> my_date.strftime('%a, %d %b %Y %H:%M:%S -0500')
'Wed, 22 Apr 2020 10:52:11 -0500'
person dlink    schedule 22.04.2020