2012-11-06 30 views
25

我試圖編寫一對函數dtut,它在正常的unix時間(秒後1970-01-01 00:00:00 UTC)和一個Python日期時間對象。將unixtime轉換爲日期時間對象並返回(時間轉換函數反轉)

如果dtut是適當的逆那麼這個代碼將打印相同的時間戳兩次:

import time, datetime 

# Convert a unix time u to a datetime object d, and vice versa 
def dt(u): return datetime.datetime.fromtimestamp(u) 
def ut(d): return time.mktime(d.timetuple()) 

u = 1004260000 
print u, "-->", ut(dt(u)) 

唉,第二時間戳是3600秒(1小時)小於第一。 我認爲這隻發生在非常特別的unixtimes,也許在那個夏令時跳過的時候。 但是有沒有辦法寫dtut,所以他們是真正的彼此反轉?

相關問題:Making matplotlib's date2num and num2date perfect inverses

+0

順便說一句,如果功能不只是調用了另一個與功能相同的參數,然後你可以分配它:'dt = datetime.datetime.utcfromtimestamp'。函數是Python中的一等公民:您可以將它們作爲參數傳遞給另一個函數,從函數返回等。 – jfs

+0

啊,很好,很棒!這樣做更有效率還是隻是一個簡潔的問題?那麼'def f(x):return foo(x)'vs'f = lambda x:foo(x)'? (我的回憶是那些在功能和效率上都是等價的)。 – dreeves

+0

'f = g'意味着f,g是兩個引用同一個函數的名字。 'def'和'lambda'創建新函數。 – jfs

回答

37

你是正確的,這種行爲與夏令時。避免這種情況的最簡單方法是確保您在沒有夏令時的情況下使用時區,UTC在此處最有意義。

datetime.datetime.utcfromtimestamp()calendar.timegm()處理UTC時間,並且是精確的逆。

import calendar, datetime 

# Convert a unix time u to a datetime object d, and vice versa 
def dt(u): return datetime.datetime.utcfromtimestamp(u) 
def ut(d): return calendar.timegm(d.timetuple()) 

下面是一些解釋背後原因datetime.datetime.fromtimestamp()有日光節約時間的問題,從文檔:

返回本地日期和時間對應的POSIX時間戳,這樣 是由time.time()返回。如果可選參數tz爲None或未指定 ,則時間戳將轉換爲平臺的本地日期 和時間,並且返回的datetime對象爲naive。

這裏的重要部分是你得到一個天真的datetime.datetime對象,這意味着沒有時區(或夏令時)信息作爲對象的一部分。這意味着多個不同的時間戳可以使用fromtimestamp()時映射到相同datetime.datetime對象,如果你碰巧挑夏令時回滾期間下降時間:

>>> datetime.datetime.fromtimestamp(1004260000) 
datetime.datetime(2001, 10, 28, 1, 6, 40) 
>>> datetime.datetime.fromtimestamp(1004256400) 
datetime.datetime(2001, 10, 28, 1, 6, 40) 
+0

完美;謝謝! (我已經證實它適用於我)。 – dreeves

+0

['ut = lambda naive_utc_dt:(naive_utc_dt - datetime(1970,1,1)).total_seconds()'](http://stackoverflow.com/a/ 8778548/4279) – jfs

+0

@JFSebastian,想添加一個答案?聽起來你是對的(雖然我沒有驗證你的版本),你的應該是這裏接受的答案。我討厭讓後代走向歧途,只有評論中的鏈接指向更好的方式! – dreeves

相關問題