Преобразование даты и времени 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
Ответы
Ответ 1
Вот некоторый рабочий код, разбитый на простые части просто для ясности:
>>> 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
, конечно, может сделать временную метку из такого кортежа.
Ответ 2
Если вы действительно хотите текущее время, просто вызовите 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'
Отредактировано: Alex Martelli отметил, что строка формата% s для strftime может быть не переносимой на разных платформах. Возможной альтернативой было бы, как он сам предложил,
>>> formatdate(time.mktime(dt.timetuple()))
'Tue, 10 Aug 2010 20:46:16 -0000'
Ответ 3
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'