2016-09-20 202 views
0

我有一個時間戳,例如1474398821633L,我認爲它是utc。我想將它與datetime.datetime.now()進行比較以驗證它是否已過期。使用utc timestamp與python 2.7比較datetime.now()

我使用Python 2.7

from datetime import datetime 

timestamp = 1474398821633L 
now = datetime.now() 

if datetime.utcfromtimestamp(timestamp) < now: 
    print "timestamp expired" 

但是我試圖從時間戳創建日期時間對象時,這個錯誤:ValueError: timestamp out of range for platform localtime()/gmtime() function

我能做些什麼?

回答

1

作爲@mgilson pointed out您的輸入可能是「毫秒」,而不是「自時代以來的秒數」。

使用time.time()代替datetime.now()

import time 

if time.time() > (timestamp_in_millis * 1e-3): 
    print("expired") 

如果您需要datetime然後使用datetime.utcnow(),而不是datetime.now()。不要比較.now()作爲天真的日期時間對象返回本地時間與utcfromtimestamp()返回UTC時間也作爲天真的日期時間對象(這就像直接比較攝氏和華氏:你應該先轉換爲同一單位)。

from datetime import datetime 

now = datetime.utcnow() 
then = datetime.utcfromtimestamp(timestamp_in_millis * 1e-3) 
if now > then: 
    print("expired") 

Find if 24 hrs have passed between datetimes - Python中查看更多詳細信息。

3

看起來像你的時間戳是以毫秒爲單位。 Python使用時間戳以秒爲:

>>> datetime.datetime.utcfromtimestamp(1474398821.633) 
datetime.datetime(2016, 9, 20, 19, 13, 41, 633000) 

換句話說,你可能需要通過1000.爲了得到它在適當的範圍來劃分的時間戳。

此外,您可能想比較datetime.utcnow()而不是datetime.now()以確保您正確處理時區:-)。

+1

@BelowtheRadar - 我猜對了:-)。我知道的其他一些語言往往以毫秒爲單位工作(例如Javascript),所以如果時間戳是毫秒時間戳而不是秒時間戳,那麼您可能具有超出範圍的時間戳看起來很自然。 – mgilson

+0

僅僅將其解釋爲毫秒是不夠的。 OP應該使用UTC時間而不是由'datetime.now()'返回的本地時間。 – jfs

+0

@ J.F.Sebastian - 這是一個很好的觀點。 – mgilson