2012-07-19 238 views
1

今天我和一些同事試圖將日期時間正確轉換爲非本地時區中的時間戳。經過多次討論,我們仍然不確定如何在一般意義上正確地將日期時間轉換爲時間戳,並且只是部分確定如何爲我們的用例做到這一點:America/New_York中的日期時間實例時區從pytz。將datetime轉換爲unix時間戳

所以,我想我會通過一些排列運行,並試圖經驗搞清楚,因爲閱讀文檔,並試圖邏輯思維它沒有得到我的任何地方。

這裏的輸入數據:

pst = pytz.timezone('America/Los_Angeles') 
est = pytz.timezone('America/New_York') 
utc = pytz.timezone('UTC') 

epoch = int(time.time()) 
# local time for me is Pacific 
local_naive = datetime.datetime.fromtimestamp(epoch) 
local_aware = datetime.datetime.fromtimestamp(epoch, pst) 
est_aware = datetime.datetime.fromtimestamp(epoch, est) 
utc_naive = datetime.datetime.utcfromtimestamp(epoch) 
utc_aware = datetime.datetime.fromtimestamp(epoch, utc) 

,結果是在四種方式計算:

  1. time.mktime(dt.timetuple())
  2. time.mktime(DT .utctimetuple())
  3. calendar.timegm(dt.timetuple())
  4. calendar.timegm(dt.utctimetuple())

我知道一些人的本質上是荒謬的,但我想成爲完整的:)。

這裏是輸出。 diff=部分是爲了幫助顯示不正確的轉換。

now epoch      : 1342671099 
est aware mktime(timetuple) : 1342681899 diff=-10800 
local aware mktime(timetuple) : 1342671099 diff=0 
local naive mktime(timetuple) : 1342671099 diff=0 
utc aware mktime(timetuple) : 1342699899 diff=-28800 
utc naive mktime(timetuple) : 1342696299 diff=-25200 
est aware mktime(utctimetuple): 1342699899 diff=-28800 
local aware mktime(utctimetuple): 1342699899 diff=-28800 
local naive mktime(utctimetuple): 1342674699 diff=-3600 
utc aware mktime(utctimetuple): 1342699899 diff=-28800 
utc naive mktime(utctimetuple): 1342699899 diff=-28800 
est aware timegm(timetuple) : 1342656699 diff=14400 
local aware timegm(timetuple) : 1342645899 diff=25200 
local naive timegm(timetuple) : 1342645899 diff=25200 
utc aware timegm(timetuple) : 1342671099 diff=0 
utc naive timegm(timetuple) : 1342671099 diff=0 
est aware timegm(utctimetuple): 1342671099 diff=0 
local aware timegm(utctimetuple): 1342671099 diff=0 
local naive timegm(utctimetuple): 1342645899 diff=25200 
utc aware timegm(utctimetuple): 1342671099 diff=0 
utc naive timegm(utctimetuple): 1342671099 diff=0 

從我可以從這個輸出告訴,一般來說,要求calendar.timegm(dt.utctimetuple())是通常正確的方式 - 除非它是一個天真的本地時間。好吧,我可以處理這個......除了我沒有看到如何從任何其他天真的時間消除局部天真的時間,這使得無法正確地將任意日期時間對象轉換爲時間戳?這是真的嗎,還是我錯過了什麼?

+1

看看這個:http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/「」「總是測量並存儲時間UTC如果需要記錄下的時間。被採取,單獨存儲。不存儲當地時間+時區信息!「」「」 – monkut 2012-07-19 05:37:44

+0

我同意@monkut,但如果您必須傳輸時間,它也應該是UTC。 [日期時間轉換到POSIX時間]的 – 2012-07-19 05:56:06

+0

可能重複(http://stackoverflow.com/questions/255035/converting-datetime-to-posix-time) – 2012-07-19 05:57:21

回答

0

我不明白你怎麼可以從任何其他的幼稚時間

究竟歧義本地天真的時間。如你所知,天真的意思是「沒有附帶時區信息」,所以timegm被迫推斷缺失的信息,你的結果表明它推斷天真的日期時間是UTC。

正如在評論中說,TZ附着時間應像對待一個燙手的山芋 - 你應該儘快你輸入轉換爲UTC,只是你輸出給用戶之前轉換爲本地。從長遠來看,這會爲你節省很多心痛。