检查时间是否在Python中的开始时间和结束时间之间的最有效方法

时间:2015-02-27 08:58:24

标签: python datetime

我已经有了这方面的工作代码,但我仍然是python的新手,我知道有更好的方法来做到这一点。这是我在树莓派上运动检测脚本中使用的代码。它只是检查它是否发生在我不在家的时间范围内。我从脚本的其余部分中删除了代码:

import time
import datetime
import calendar

now = datetime.datetime.now()
x = time.localtime(time.time())

starttime = datetime.datetime(x.tm_year,x.tm_mon,x.tm_mday,8,20,0)
start_timestamp =  calendar.timegm(starttime.timetuple())
now_timestamp =  calendar.timegm(now.timetuple())
future = starttime + datetime.timedelta(minutes=550)
future_timestamp =  calendar.timegm(future.timetuple())

print start_timestamp
print now_timestamp
print future_timestamp

if now_timestamp > start_timestamp and now_timestamp < future_timestamp:
    print "bam!"

我需要做的就是查看当前时间是否在开始时间和结束时间之间。我确信有一种方法可以更有效地编写这些内容,我认为我的代码相当迟钝。

3 个答案:

答案 0 :(得分:2)

您不需要使用时间戳并继续转换为通过 - datetime对象支持比较。所以你可以把它缩短为:

from datetime import datetime, timedelta

now = datetime.now()
start_time = now.replace(hour=8, minute=20, second=0)
end_time = start_time + timedelta(minutes=550)

if start_time <= now <= end_time:
    print 'was out'

答案 1 :(得分:0)

使用:int(time.time())将当前时间隐藏到纪元时间。您可以使用以下方法比较此值:

import time
# 60*60*24 --> count of seconds in one day

current_time = int(time.time())
start_time = current_time - 4*60*60*24  # Marking start_time as of 4 days back
end_time = current_time + 2*60*60*24  # Marking end_time as of 2 days ahead

if start_time < current_time <= end_time:
    print('Yes, time is between start_time & end_time')

其中start_timeend_time也是纪元时间的值。

答案 2 :(得分:0)

当地时间不是单调的,d2 < d1 True并不意味着过去相对于d2的{​​{1}} 总是 d1d1是代表当地时间的天真日期时间对象。

如果d2start_time <= now <= end_time可能在DST转换结束时发生,请不要使用start_time,其值是指向本地时间的天真日期时间对象。

如果要处理本地时区的utc偏移量的变化,则需要使用时间戳或UTC时间或时区感知的日期时间对象。

如果end_time作为当地时间给出,例如,今天在start_time'8:20'是相对时间(非绝对),例如,end_time分钟到达未来:

550

对于大于几秒的时间间隔,您无需考虑闰秒周围发生的情况,例如2015-06-30 23:59:60 + 0000。或者由于ntp调整等导致的#!/usr/bin/env python import time from datetime import datetime start_time = datetime.strptime('8:20','%H:%M').time() start_dt = datetime.combine(datetime.now(), start_time) start_ts = time.mktime(start_dt.timetuple()) #NOTE: may fail, see the link below end_ts = start_ts + 550*60 # +550 minutes if start_ts <= time.time() < end_ts: print "the current time is in between" 值的变化

另见Find if 24 hrs have passed between datetimes - Python

如果您想知道给定的当地时间,例如time.time()是否属于当地时间指定为小时:分钟范围的时间间隔,例如'2:26';见python time range validator