2010-08-10 104 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' 
相關問題