查找date时间之间是否经过了24小时 – Python

我有以下的方法:

# last_updated is a datetime() object, representing the last time this program ran def time_diff(last_updated): day_period = last_updated.replace(day=last_updated.day+1, hour=1, minute=0, second=0, microsecond=0) delta_time = day_period - last_updated hours = delta_time.seconds // 3600 # make sure a period of 24hrs have passed before shuffling if hours >= 24: print "hello" else: print "do nothing" 

我想知道last_updated是否已经过了24小时,我怎样才能在Python做到这一点?

如果last_updated是表示UTC时间的朴素datetime对象:

 from datetime import datetime, timedelta if (datetime.utcnow() - last_updated) > timedelta(1): # more than 24 hours passed 

如果last_updated是本地时间(天真(timezone-unaware)date时间对象):

 import time DAY = 86400 now = time.time() then = time.mktime(last_updated.timetuple()) if (now - then) > DAY: # more than 24 hours passed 

如果last_updated是一个模棱两可的时间,例如,DST过渡结束的时间(在许多时区每年一次),那么mktime()返回错误的结果(例如,closures一个小时) 。

如果C time库不使用给定平台上的历史时区数据库, 并且本地时区的UTC偏移在最后更新时间与现在相比不同,则time.mktime()也可能失败。 它可能适用于去年所有时区的三分之一以上。 Linux,OS X,Windows的最新版本都有tz数据库(我不知道旧的Windows版本是否适用于过去的date)。

注意:编写datetime.now() - last_updated (类似于UTC的情况)可能会很诱人,但如果UTC偏移量在last_updated时间不同(可能在许多时区中),它将保证在所有平台上都失败。 基于mktime()的解决scheme至less可以在某些平台上使用tz数据库,因此无论出于何种原因它都可以处理UTC偏移量的变化。

为便于携带,您可以安装tz数据库。 它由Python中的pytz模块提供。 tzlocal可以返回当地时区对应的pytz时区:

 from datetime import datetime, timedelta from tzlocal import get_localzone # $ pip install tzlocal tz = get_localzone() # local timezone then = tz.normalize(tz.localize(last_updated)) # make it timezone-aware now = datetime.now(tz) # timezone-aware current time in the local timezone if (now - then) > timedelta(1): # more than 24 hours passed 

即使UTC偏移量在过去不同,它也能正常工作。 但它不能(以及time.mktime() )修复不明确的时间( tz.localize()默认selectis_dst=False时间)。 tz.normalize()来调整不存在的时间,例如那些对应于DST开始转换的时间(它不应该影响结果)。

上面的代码假定last_updated是一个天真的date时间对象(没有关联的时区信息)。 如果last_updated是一个知道的date时间对象,那么很容易将其转换为UTC:

 from datetime import datetime, timedelta then_in_utc = last_updated.replace(tzinfo=None) - last_updated.utcoffset() if (datetime.utcnow() - then_in_utc) > timedelta(1): # more than 24 hours passed 

一般注意事项:现在您应该了解为什么人们推荐使用UTC时间,并只使用本地时间进行显示。

只是为了清除我们的一些事情,因为我不认为我们所有人都利用Python lib的time 。 当你使用datetime ,尤其是在Django中,这是一个非常普遍的做法,如果你做这样的比较:

 if (now - then) > DAY: 

它将非常失败 。 这是因为你不能比较datetime.timedelta int

解决scheme是将您的对象转换为秒。
例如:

 from datetime import datetime then = datetime_object now = datetime.now() if (now - then).total_seconds() > NUMBER_OF_SECONDS: # do something 

希望我能帮助那些遇到问题的人。
干杯