我正在用 Python 实现一些计划任务。主程序 24/7 全天候运行,它以类似于 cron 的方式运行单个任务。我需要确定是否应该多次再次运行任务。在这种情况下,我将获得上次运行任务的时间、当前时间(均作为 Unix 时间戳,通过获取datetime.datetime.utcnow().timestamp()并轻松转换为datetime.datetime对象)以及计划时间(例如,每小时每 15 分钟一次,例如0:15,1:15, ..., 23:15)。我想确定是否有任何预定时间在上次运行时间和当前时间之间,可能是布尔值。保证安排的时间总是“时间”(例如“2:00”)并且不涉及“日期”(例如任何一个月的第一天或任何星期一)。示例数据:import datetimescheduled = [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 wantassert some_method(scheduled, previous, falsey) is Falseassert some_method(scheduled, previous, truthy) is True这里有一些我也想介绍的特殊情况scheduled = [datetime.time(1, 0)] # 1:00 AMprevious = 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 Falseassert some_method(scheduled, previous, truthy) is True上面的例子应该是True因为预定时间“1 AM”介于“11月30日晚上11点”和“12月1日凌晨2点”之间。我无法直接比较时间,因为“凌晨 1 点”不在同一天的“凌晨 2 点”和“晚上 11 点”之间,而是在不同日期的两个时间之间。
2 回答
肥皂起泡泡
TA贡献1829条经验 获得超6个赞
如何使用timedelta和比较timetuples?
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
添加回答
举报
0/150
提交
取消