2011-07-15 75 views
7

我從Python程序中的Web服務檢索unix時間戳。此時間戳在美國時區。爲了在法國本地化其他對象中將其插入MySQL數據庫,我想將此時間戳轉換爲法國時區。將unix時間戳更改爲不同的時區

我可以用數學函數做到這一點,但存在夏令時問題。我寧願使用Python時間和日期特定的函數來處理這些概念。

您有提示,我迷失在Python文檔中嗎?

+0

零對應什麼? 00:00:00 1970年1月1日PST或01:00:00 1970年1月1日PST? –

+0

好問題,我頭撞牆3小時...事實上,它接縫,它不是PST,但PDT。我有一個額外的時間(這導致我-7h,而不是 - 8H),但在法國,我們在夏季UTC + 2H和冬季+ 1H。我無法用數學函數弄清楚它。我可能需要pytz – iwalktheline

+0

我的問題是不準確的,我錯過了問題的根源。我打開另一個線程 – iwalktheline

回答

4

過去,當我們從服務提供商處下載的文件的時間戳具有與PST時區對應的時間戳時,我遇到了類似的問題。下面幫我做了一下轉換:

import pytz, datetime, time 
import os 

originalTimeStamp = os.stat("/tmp/file-from-us-west-coast").st_mtime 

# prints e.g. 2010-03-31 13:01:18 
print "original:",datetime.datetime.fromtimestamp(originalTimeStamp) 

# re-interpret 
originalTimeZone = "America/Los_Angeles" 
targetTimeZone = "Europe/Paris" 

newTimeStamp = pytz.timezone(originalTimeZone).localize(datetime.datetime.fromtimestamp(originalTimeStamp)).astimezone(pytz.timezone(targetTimeZone)) 

# prints e.g. 2010-03-31 22:01:18+02:00 
print "new:  ",newTimeStamp 

# convert back to seconds since epoch 
newTimeStamp = time.mktime(newTimeStamp.timetuple()) 

# print time difference in hours 
print (newTimeStamp - originalTimeStamp)/3600.0 
+0

即使我的問題被錯誤地解釋了(我沒有找到確切的問題),你解決了它:) – iwalktheline

+0

如果你可以測試任意日期,作爲一個終極測試,我會建議測試發生了什麼2011年11月3日。歐洲將有冬令時,而美國仍有夏令時(見http://www.worldtimezone.com/daylight.html) –

5

如果它確實是一個unix時間戳,那麼它是基於UTC的。只是爲你的用例正確解釋它。僅在必須以文本形式打印此日期時應用時區翻譯。

如果您也將它作爲時間戳存儲在您身邊,請保持原樣。

+1

這不是一個「unix時間戳」,而是根據最初的太平洋時區1970年1月1日過去的秒數。這很醜陋,我知道,但它是Facebook API。我不能保留它,因爲我有其他基於真正的「unix時間戳」的對象:UTC – iwalktheline

+1

如果你知道它是太平洋時間,而不是變化,你可以添加8小時使其成爲UTC,並用作unix時間戳。 – viraptor

+0

事實上Facebook的api並沒有考慮到法國的夏季是GMT + 2,春季是GMT + 1。所有數據均作爲填充日期存儲在數據庫中,但在太平洋標準時區中。例如,我在facebook網站上創建一個事件2011-07-15 23:00。它存儲爲2011-07-15 23:00-0000(PST)。所有的問題都來自這裏。 pytz解決了這個問題 – iwalktheline

1

pytz可能會幫助你在這裏。就像viraptor說的,理想情況下,你會將所有的日期時間存儲爲unix UTC時間戳,並且只將本地化時打印出來。

相關問題