Python3.6定时任务调度问题:按起止时间执行JobA/JobB及代码报错求助
Python 3.6 通用任务调度实现及问题修复
问题根源
你遇到的"一直输出Both jobs are currently offline"问题,核心是跨天时间范围的判断逻辑错误:JobB的结束时间(08:55)早于开始时间(18:00),如果直接用当前时间 >= 开始时间 and 当前时间 <= 结束时间的逻辑,这个条件永远无法成立,导致任务匹配失败。
通用实现方案
下面的代码将任务配置与判断逻辑解耦,支持灵活修改任务时间,同时正确处理跨天场景:
from datetime import datetime import time # 可配置任务列表,修改/新增任务直接调整此处即可 JOBS = [ { "name": "JobA", "start_time": "09:00:00", "end_time": "17:55:00", "task": lambda: print("Executing JobA...") }, { "name": "JobB", "start_time": "18:00:00", "end_time": "08:55:00", "task": lambda: print("Executing JobB...") } ] def is_time_in_range(current_time, start_str, end_str): """判断当前时间是否在指定范围内,自动处理跨天场景""" # 解析时间字符串为time对象 start = datetime.strptime(start_str, "%H:%M:%S").time() end = datetime.strptime(end_str, "%H:%M:%S").time() current = current_time.time() if start <= end: # 非跨天场景:时间范围在同一天内 return start <= current <= end else: # 跨天场景:时间范围覆盖当天晚些时候到次日凌晨 return current >= start or current <= end def run_scheduler(): while True: now = datetime.now() task_triggered = False for job in JOBS: if is_time_in_range(now, job["start_time"], job["end_time"]): job["task"]() task_triggered = True break # 同一时间仅执行第一个匹配的任务,可根据需求调整 if not task_triggered: print("Both jobs are currently offline.") # 每隔60秒检查一次,可按需调整间隔 time.sleep(60) if __name__ == "__main__": run_scheduler()
关键特性说明
- 灵活配置:所有任务的时间、名称、执行逻辑都集中在
JOBS列表中,修改任务参数无需改动核心判断逻辑。 - 跨天时间兼容:
is_time_in_range函数自动识别跨天场景,通过current >= start or current <= end的逻辑正确匹配18:00到次日08:55的时间区间。 - 可扩展任务逻辑:任务的执行逻辑可以替换为任意自定义函数,比如将
lambda替换为复杂业务逻辑的函数名即可。
内容的提问来源于stack exchange,提问作者Lav Sharma
相关产品推荐
相关产品推荐

