检查列表中是否有任何时间在两个时间戳之间



我正在Python中实现一些计划任务。主程序是全天候运行的,它以类似于cron的方式运行单个任务。我需要确定是否应该根据时间再次运行任务。

在这种情况下,我将获得任务最后一次运行的时间、当前时间(均为Unix时间戳,通过datetime.datetime.utcnow().timestamp()获得,并可轻松转换为datetime.datetime对象(以及计划时间(例如,每15分钟一小时,如0:151:15、…、23:15(。我想确定是否有任何计划时间在上次运行时间和当前时间之间,可能是一个布尔值。保证计划时间始终是"时间"(例如"2:00"(,不涉及"日期"(例如任何月的1日或任何周一(。

示例数据:

import datetime
scheduled = [datetime.time(h, m) for h, m in [(0, 15), (6, 15), (12, 15), (18, 15)]]
previous = datetime.datetime(2018, 11, 30, 5)
truthy = datetime.datetime(2018, 11, 30, 7)
falsey = datetime.datetime(2018, 11, 30, 6)
# some_method() is what I want
assert some_method(scheduled, previous, falsey) is False
assert some_method(scheduled, previous, truthy) is True

这里有一些特殊情况,我也想涵盖

scheduled = [datetime.time(1, 0)]  # 1:00 AM
previous = datetime.datetime(2018, 11, 30, 23)
truthy = datetime.datetime(2018, 12, 1, 2, 0)
falsey = datetime.datetime(2018, 12, 1, 0, 30)
assert some_method(scheduled, previous, falsey) is False
assert some_method(scheduled, previous, truthy) is True

上面的例子应该是True,因为计划时间"1 AM"介于"11月30日晚上11点"one_answers"12月1日凌晨2点"之间。我无法直接比较时间,因为"凌晨1点"不是在同一天的"凌晨2点"one_answers"晚上11点"之间,而是在不同日期的两个时间之间。

一个简单的方法似乎是以下函数:

def some_method(scheduled, prev, next):
date1 = prev.date()
date2 = next.date()
if (next - prev).total_seconds() > 86400:
return True
for s in scheduled:
for date in {date1, date2}:
temp = datetime.datetime(date.year, date.month, date.day, s.hour, s.minute, s.second)
if prev < temp < next:
return True
return False

我会让别人来美化它,但这似乎奏效了。

使用timedelta并比较timetuple如何?

def some_method(scheduled, prev, datetime_to_check):
yesterday = datetime_to_check - datetime.timedelta(days=1)
schedule = [(*yesterday.timetuple()[:3], s.hour, s.minute) for s in scheduled]
schedule.extend((*datetime_to_check.timetuple()[:3], s.hour, s.minute) for s in scheduled)
prev_tup = prev.timetuple()
check_tup = datetime_to_check.timetuple()
for scheduled_time in schedule:
if prev_tup < scheduled_time < check_tup:
return True
return False

最新更新