将Python datetime转换为rfc 2822

2024-09-28 21:50:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将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

Tags: 方法infromimportmostdatetimeemailrfc
3条回答

以下是一些工作代码,为了清楚起见,它们被分解成简单的片段:

>>> 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也可以用这样的元组来生成时间戳。

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'

如果确实需要当前时间,只需调用不带参数的formatdate

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

但是,如果必须传递参数,则需要输出time.time(自1970年1月1日起的秒数):

>>> 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注意到strftime的'%s'格式字符串可能无法跨平台移植。一个可能的替代方案是,正如他自己所建议的那样

>>> formatdate(time.mktime(dt.timetuple()))
'Tue, 10 Aug 2010 20:46:16 -0000'

相关问题 更多 >