2016-01-30 70 views
0

這裏就是我想要做的事:1小時關閉時轉換RFC 2822日期爲datetime

>>> from email.utils import parsedate 
>>> tup = parsedate("Fri, 22 Jan 2016 10:15:00 GMT") 
>>> tup 
(2016, 1, 22, 10, 15, 0, 0, 1, -1) 
>>> import datetime 
>>> import time 
>>> timestamp = time.mktime(tup) 
>>> timestamp 
1453454100.0 
>>> datetime.datetime.utcfromtimestamp(timestamp) 
datetime.datetime(2016, 1, 22, 9, 15) 

我使用的email.utils.parsedate函數解析RFC 2822日期到struct_time。這看起來是正確的,小時部分是10。然後,我使用time.mktime將其轉換爲時間戳,然後使用datetime.utcfromtimestamp嘗試獲取UTC日期時間,但出於某種奇怪的原因,日期時間中的小時數爲9。我真的不明白爲什麼。

我在UTC + 1,所以有可能轉換到當地時間發生的地方,但我不知道在哪裏。

+0

什麼是您的時區? – Psytho

+0

我在UTC + 1。使用parsedate_tz也不起作用。它返回一個時區偏移量作爲元組中的一個額外的元素,但不會影響元組的其餘部分。所以有可能轉換到當地時間發生,但我不知道在哪裏。 – bigblind

+0

也許'email.parsedate'函數將'GMT'作爲時區處理,並且包含夏令時?一般來說,我會避免混合像你這裏做的幾個不同的模塊(電子郵件,時間和日期時間)。 'pytz'是處理時間和時區的非常好的軟件包。 –

回答

1

的問題是,mktime預計,元組是本地時間。還有calendar.gmtime,它預計它在UTC。我實際上可能只是最終使用dateutil作爲@Boaz建議

0

Time access and conversions

time.mktime(T):
這是本地時間的反函數()。它的參數是struct_time或完整的9元組(因爲需要dst標誌;如果它是未知的,則使用-1作爲dst標誌),它表示本地時間的時間,而不是UTC。

獲得正確的結果,你應該使用calendar.timegm()

>>> calendar.timegm(tup) 
1453457700 
0

您還可以使用日期時間。

>>> from datetime import datetime as dt 
>>> d = "Fri, 22 Jan 2016 10:15:00 GMT" 
>>> dt.strptime(d, "%a, %d %b %Y %H:%M:%S %Z") 
datetime.datetime(2016, 1, 22, 10, 15)