将Python datetime转换为rfc 2822

Ada*_*son 28 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
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 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'
Run Code Online (Sandbox Code Playgroud)

说明:email.utils.formatdate想要一个时间戳 - 即,自纪元以来具有秒(及其分数)的浮点数.一个datetime实例不会直接给你一个时间戳-但是,它可以给你一个时间元组与timetuple法,time.mktime那当然可以从这样一个元组的时间戳.

  • 在3.3版本中,`datetime`有了`timestamp`方法,使这个过程更快. (3认同)
  • 为什么不只是使用time.time()? (2认同)

rbp*_*rbp 25

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

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

但是,如果你必须传递一个参数,你想要输出time.time(自1970年1月1日以来的秒数):

>>> import time
>>> formatdate(time.time())
'Tue, 10 Aug 2010 20:41:43 -0000'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

编辑:Alex Martelli指出,strftime的'%s'格式字符串可能无法跨平台移植.正如他自己建议的那样,可能的替代方案是,

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


Fau*_*aux 8

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'
Run Code Online (Sandbox Code Playgroud)