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

时间:2014-10-11 10:11:09

标签: python datetime timezone

我有以下方法:

# 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中做到这一点?

2 个答案:

答案 0 :(得分:17)

如果last_updated是一个天真的日期时间对象,表示UTC时间:

from datetime import datetime, timedelta

if (datetime.utcnow() - last_updated) > timedelta(1): 
    # 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是一个模糊的时间,例如,在DST过渡期间(在许多时区中每年一次)的时间,那么mktime()返回错误的概率为五十五结果(例如,关闭一小时)。

如果C time.mktime()库未在给定平台上使用历史时区数据库,则

time也可能失败本地时区的UTC偏移量在{ {1}}时间与现在相比。它可能适用于去年所有时区的三分之一以上。 Linux,OS X,最新版本的Windows都有tz数据库(我不知道旧的Windows版本是否适用于过去的日期)。

注意:编写last_updated可能很诱人(类似于UTC的情况)但如果UTC偏移量在datetime.now() - last_updated时间不同,则保证在所有平台上都失败(可能在last_updated很多时区)。基于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(1):
    # 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(1):
    # more than 24 hours passed

一般说明:您现在应该了解为什么人们建议使用UTC时间并仅使用当地时间进行显示。

答案 1 :(得分:2)

只是为了清除我们的一些事情,因为我不认为我们所有人都使用time Python lib。 当你使用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

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