查找日期时间之间是否已过去24小时



我有以下方法:

# 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时间的初始日期时间对象:

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

如果last_updated是本地时间(不知道时区的)日期时间对象):

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

如果last_updated是一个不明确的时间,例如夏令时转换结束期间的时间(在许多时区中每年一次),则mktime()返回错误结果的可能性为50%(例如,偏离一小时)。

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

注意:编写datetime.now() - last_updated可能很诱人(类似于UTC的情况),但如果last_updated时间的UTC偏移量不同(在许多时区都有可能),那么它在所有平台上都会失败。基于mktime()的解决方案至少可以在某些平台上使用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(hours=24):
    # more than 24 hours passed

即使UTC偏移量在过去有所不同,它也能工作。但它不能(和time.mktime()一样)修复不明确的时间(默认情况下,tz.localize()选择is_dst=False时间)。调用tz.normalize()来调整不存在的时间,例如,与DST转换的开始相对应的时间(它不应该影响结果)。

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

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

一般注意事项:您现在应该明白为什么人们建议使用UTC时间并仅使用本地时间进行显示。

只是为了澄清我们的一些事情,因为我不认为我们所有人都使用time Python库。当你使用datetime时,这在Django中是一种非常常见的做法,如果你这样做比较:

if (now - then) > DAY:

它将极大地失败。这是因为您无法将datetime.timedeltaint进行比较。

解决方法是将对象转换为秒
例如:

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

希望我能帮助那些在这方面遇到问题的人。
欢呼

相关内容

  • 没有找到相关文章

最新更新