将Python datetime转换为rfc 2822

时间:2010-08-10 20:33:25

标签: python datetime rfc2822

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

4 个答案:

答案 0 :(得分:38)

这里有一些工作代码,为了清楚起见分解成简单的部分:

>>> 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当然可以从这样的元组中创建一个时间戳。

答案 1 :(得分:24)

如果您确实想要当前时间,只需在没有参数的情况下调用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'

答案 2 :(得分:8)

Python 3.3,除了其他评论者提到的方法外,还添加了一个var actionContext = context.Resource as Microsoft.AspNetCore.Mvc.ActionContext; 方法,它更清晰:

format_datetime

答案 3 :(得分:0)

使用strftime的简单方法。 Python 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'