如果
last_updated
是代表UTC时间的无时区日期时间对象:
from datetime import datetime, timedelta
if (datetime.utcnow() - last_updated) > timedelta(hours=24):
如果 last_updated
是本地时间(不带时区信息的日期时间对象):
import time
DAY = 86400
now = time.time()
then = time.mktime(last_updated.timetuple())
if (now - then) > DAY:
如果
last_updated
是模糊时间,例如在许多时区一年中的一次夏令时转换期间,则
mktime()
返回错误结果(例如,误差为一小时)的机会是50/50。
time.mktime()
还可能失败,如果C
time
库在给定平台上没有使用历史时区数据库,并且与现在相比,本地时区的UTC偏移在
last_updated
时间不同。这可能适用于去年所有时区的三分之一以上。Linux、OS X和最近版本的Windows都有tz数据库。要注意的是,如果在
last_updated
时间UTC偏移不同(在许多时区可能会出现),编写
datetime.now() - last_updated
(类似于UTC情况)可能会很诱人,但保证在所有平台上失败。基于
mktime()
的解决方案可以在某些平台上利用tz数据库,因此它可以处理UTC偏移的任何更改。对于可移植性,您可以安装tz数据库。Python中的
pytz
模块提供它。
tzlocal
可以返回与当地时区相应的
pytz
时区:
from datetime import datetime, timedelta
from tzlocal import get_localzone
tz = get_localzone()
then = tz.normalize(tz.localize(last_updated))
now = datetime.now(tz)
if (now - then) > timedelta(hours=24):
即使过去的UTC偏移量不同,它也能正常工作。但是它无法(以及time.mktime()
)修复有歧义的时间(tz.localize()
默认选择is_dst=False
的时间)。调用tz.normalize()
来调整不存在的时间,例如那些对应于DST转换的开始时间(它不应该影响结果)。
以上代码假定last_updated
是一个naive datetime对象(没有关联时区信息)。如果last_updated
是一个aware datetime对象,则很容易将其转换为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):
一般提示:现在您应该明白为什么人们建议使用UTC时间并仅在显示时使用本地时间。
last_updated
是什么?它是本地时间吗?您想要找出是否已经过去了超过24小时,还是下一天的当前时间更大,例如,last_updated=11月1日,晚上7点
,而当前时间是11月2日,下午6:30
(已经超过24小时,但是6:30 PM小于7 PM)(在纽约)。 - jfslast_updated
的UTC时间或Unix时间戳吗?你可以使用第三方模块吗?你需要支持Windows吗?如果你的代码每年会有一两个小时的错误,你介意吗? - jfs