将Python日期时间转换为RFC 2822格式

36 投票
5 回答
23450 浏览
提问于 2025-04-16 02:36

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

5 个回答

11

在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'
27

如果你想要获取当前时间,只需要调用 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'

顺便提一下,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'
51

这里有一些可以运行的代码,分成简单的部分以便于理解:

>>> 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 需要一个时间戳,也就是从1970年1月1日以来的秒数(包括小数部分)。一个datetime实例并不能直接给你时间戳,但它可以通过timetuple方法给你一个时间元组,然后你可以用time.mktime从这个元组中生成时间戳。

补充说明:在Python 3.3及更新版本中,你可以用更少的步骤来完成同样的事情:

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

查看format_datetime文档以获取使用的详细信息。

撰写回答