2010-08-10 103 views
25

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

回答

36

这里的一些工作的代码,分解成简单的部分只是为了清晰:

>>> 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

为什么不只是使用time.time()? – 2015-01-16 02:11:42

+2

在3.3版本中'datetime'有'timestamp'方法,使得这个过程更快。 – 2015-09-11 15:42:28

23

如果你确实想当前的时间,只需拨打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' 

编辑:亚历克斯·马尔泰利指出的是,“%s”的格式字符串的strftime可能无法移植跨平台。另一种可能是,正如他自己所说,

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

有趣 - 的''%s''格式'出现strftime'没有文档,因此是“碰巧在某些平台上工作”(但不是全部)的文档之一 - 除非您有文档显示它将会跨平台工作? – 2010-08-10 20:51:52

+0

实际上,这是Unix“date”命令用来输出基于时代的时间的格式字符串,我没有想到它就会使用它,它工作:)我会检查并回复你(或更改我的答案)。 – rbp 2010-08-10 20:55:45

+0

那么,http://docs.python.org/library/datetime.html#strftime-strptime-behavior指出:“支持的全套格式代码在不同平台上有所不同,因为Python调用平台C库的strftime()函数,和平台的变化是常见的。“而且,在Linux上,man 3 strftime列出'%s'作为可能的格式值。所以我想你是对的,它可能不是可移植的。谢谢:) – rbp 2010-08-10 20:58:55

5

的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' 
相关问题