我已经有了这方面的工作代码,但我仍然是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!"
我需要做的就是查看当前时间是否在开始时间和结束时间之间。我确信有一种方法可以更有效地编写这些内容,我认为我的代码相当迟钝。
答案 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_time
和end_time
也是纪元时间的值。
答案 2 :(得分:0)
当地时间不是单调的,d2 < d1
True
并不意味着过去相对于d2
的{{1}} 总是 d1
,d1
是代表当地时间的天真日期时间对象。
如果d2
,start_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。