今天我和一些同事試圖將日期時間正確轉換爲非本地時區中的時間戳。經過多次討論,我們仍然不確定如何在一般意義上正確地將日期時間轉換爲時間戳,並且只是部分確定如何爲我們的用例做到這一點: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)
,結果是在四種方式計算:
- time.mktime(dt.timetuple())
- time.mktime(DT .utctimetuple())
- calendar.timegm(dt.timetuple())
- 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())是通常正確的方式 - 除非它是一個天真的本地時間。好吧,我可以處理這個......除了我沒有看到如何從任何其他天真的時間消除局部天真的時間,這使得無法正確地將任意日期時間對象轉換爲時間戳?這是真的嗎,還是我錯過了什麼?
看看這個:http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/「」「總是測量並存儲時間UTC如果需要記錄下的時間。被採取,單獨存儲。不存儲當地時間+時區信息!「」「」 – monkut 2012-07-19 05:37:44
我同意@monkut,但如果您必須傳輸時間,它也應該是UTC。 [日期時間轉換到POSIX時間]的 – 2012-07-19 05:56:06
可能重複(http://stackoverflow.com/questions/255035/converting-datetime-to-posix-time) – 2012-07-19 05:57:21