2013-02-12 204 views
1

我想提出一個新聞博客爲我的項目經過分鐘,我有把這個消息標題爲x分鐘前等轉換時間戳在Python

從新聞的RSS源來顯示時間,我有一個字符串形式的時間戳。例如:

時間戳=「星期二,2013年2月12日7時43分09秒格林尼治標準時間」

我試圖找到這個時間戳和使用日期時間模塊在Python本時間之間的差。但由於某些原因,它給人的錯誤:

ValueError異常:astimezone()不能被應用到天真的日期時間

,我會很感激,如果有人能在正確的方向指向我。以下是我在Python中的嘗試:

from datetime import datetime 
from pytz import timezone 
timestamp = 'Tue, 12 Feb 2013 07:43:09 GMT' 
t = datetime.strptime(timestamp, '%a, %d %b %Y %I:%M:%S %Z') 
now_time = datetime.now(timezone('US/Pacific')) 
# converting the timestamp to Pacific time 
t_pacific = t.astimezone(timezone('US/Pacific')) # get error here 
diff = t_pacific - t 

謝謝! Prakhar

+0

您是否遇到了計算不帶時區轉換差異的特定問題(例如,如果您跳過對時區的調用,它是否正常工作)? – Hannele 2013-02-12 23:47:56

回答

3

你的例子有幾個問題(我看你現在已經修復它們):

  • 第一行應該是:

    from datetime import datetime 
    
  • 看起來好像你在第4行缺少右括號:

    now_time = datetime.now(timezone('US/Pacific') 
    
  • 什麼是timezone()?這是從哪裏來的?

你真的不需要搞時區,我不認爲 - 只是使用GMT(UTC)。如何更多的東西是這樣的:

from datetime import datetime 
timestamp = 'Tue, 12 Feb 2013 07:43:09 GMT' 
t = datetime.strptime(timestamp, '%a, %d %b %Y %I:%M:%S %Z') 
t_now = datetime.utcnow() 
diff = t_now - t 
+0

感謝您發現錯誤。我更新了代碼。但我仍然得到錯誤。 – 2013-02-12 23:50:00

+0

也讀取了datetime.timedelta對象。 – 2013-02-12 23:52:01

+0

明白了!非常感謝Craig。我被轉換搞亂了。 – 2013-02-12 23:57:45

2

這裏的問題是,t沒有一個時區,這就是錯誤消息的「天真的日期時間」的意思。從the docs

There are two kinds of date and time objects: 「naive」 and 「aware」… An aware object has sufficient knowledge of… time zone and daylight savings time information… A naive object does not…

您可以驗證它是做這個天真:

print(t.tzinfo) 

答案將是None

由於astimezone docs說:

self must be aware (self.tzinfo must not be None , and self.utcoffset() must not return None).

strptime功能總是生成一個天真的日期時間。

您可以通過多種方式解決這個問題:

  • 首先轉換t爲GMT日期時間,而不是一個天真的一個,然後將轉換爲'US/Pacific'會工作。

正如文檔所言,「如果您只想將時區對象tz附加到日期時間dt而不調整日期和時間數據,請使用dt.replace(tzinfo=tz)。」既然你知道時間是UTC,只需要replace與UTC的空tz,你有一個意識到的時間。

  • 使用與astimezone不同的機制轉換爲PST,其中將採用UTC或允許您指定源的機制。

有不同的選擇,但你已經使用pytz,所以請參閱its documentation

  • now_time轉換爲UTC而不是將t轉換爲PST。

最後一個對大多數用例來說可能是最簡單和最好的。由於您在PST中只有now_time,因爲您明確要求這樣做,所以您只需要這樣做(或明確要求'GMT'而不是'US/Pacific')。然後你可以在UTC時間做你的日期算術。

如果您需要在PST中顯示最終結果,通常以UTC計算算術效果更好,並在結束時進行轉換。 (例如,您可以有兩次相隔一小時,但是在太平洋地區有相同的值,因爲DST日的凌晨1點會重複兩次;如果您始終保持UTC的狀態,這不會成爲問題。)

+0

非常感謝@abarnert的解釋。我會接受你的建議並以UTC來進行算術。 – 2013-02-13 01:52:29

+0

@PrakharMehrotra:當然,Craig McQueen在我寫完答案之前已經給出了這個建議......但是你已經接受了他的答案,所有事情都應該如此。 – abarnert 2013-02-13 18:31:35