2016-09-20 122 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