查看日期时间之间是否已经过了24小时 – Python

Find if 24 hrs have passed between datetimes - Python

我有以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
# 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表示的时间:

1
2
3
4
from datetime import datetime, timedelta

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

如果last_updated是本地时间(naive(timezone unknowled)datetime对象):

1
2
3
4
5
6
7
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()返回错误结果的概率为50%。

如果c time库不在给定平台上使用历史时区数据库,并且本地时区的UTC偏移量在last_updated时间与现在不同,那么time.mktime()也可能失败。在过去一年中,它可能适用于所有时区的三分之一以上。Linux、OSX、Windows的最新版本都有TZ数据库(我不知道旧的Windows版本是否适用于过去的日期)。

注意:写datetime.now() - last_updated可能很有诱惑力(类似于UTC的情况),但是如果在last_updated时间的UTC偏移量不同(在许多时区是可能的),则保证在所有平台上都会失败。基于mktime()的解决方案至少可以在某些平台上使用TZ数据库,因此它可以以任何原因处理UTC偏移量中的更改。

为了便于移植,您可以安装TZ数据库。它由python中的pytz模块提供。tzlocal可以返回本地时区对应的pytz时区:

1
2
3
4
5
6
7
8
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()默认选择is_dst=False时间)。调用tz.normalize()来调整不存在的时间,例如,对应DST转换开始的时间(它不应影响结果)。

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

1
2
3
4
5
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时间,并且只将本地时间用于显示。


只是为了澄清一些问题,因为我不认为我们所有人都使用了timepython lib。当您使用datetime时,尤其是在django,这是一种非常常见的做法,如果您这样做比较:

1
if (now - then) > DAY:

它将彻底失败。这是因为你不能将datetime.timedeltaint进行比较。

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

1
2
3
4
5
6
7
from datetime import datetime

then = datetime_object
now = datetime.now()

if (now - then).total_seconds() > NUMBER_OF_SECONDS:
    # do something

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