Python自定义任务调度器:计算首个及后续有效执行日期
自定义任务调度器:获取下一个有效工作日实现
核心逻辑思路
- 将工作日名称映射为固定索引(周一到周日对应0-6)
- 提取有效工作日的索引并排序,确保按时间顺序查找
- 对比当前日期的工作日索引,找到下一个有效日:
- 优先选取本周内晚于当前日期的有效工作日
- 若本周无剩余有效日,则取下周第一个有效工作日
- 根据索引差计算天数,加到当前日期上得到结果
完整代码实现
import datetime # 固定的工作日顺序:周一到周日 sorted_week_days_list = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] # 创建工作日到索引的映射字典 week_day_index = {day: idx for idx, day in enumerate(sorted_week_days_list)} def get_next_valid_date(current_date: datetime.datetime, valid_days: list) -> datetime.datetime: """ 获取给定日期之后的下一个有效工作日 :param current_date: 当前日期(datetime对象) :param valid_days: 有效工作日列表(如["Monday", "Friday"]) :return: 下一个有效工作日的datetime对象 """ current_day_name = current_date.strftime("%A") current_idx = week_day_index[current_day_name] # 将有效工作日转换为索引并排序 valid_indices = sorted([week_day_index[day] for day in valid_days]) # 查找下一个有效索引 next_idx = None for idx in valid_indices: if idx > current_idx: next_idx = idx break # 若本周无剩余有效日,取下周第一个有效日 if next_idx is None: next_idx = valid_indices[0] + 7 # 计算天数差并得到下一个有效日期 days_diff = next_idx - current_idx return current_date + datetime.timedelta(days=days_diff) # ------------------- 测试示例 ------------------- # 示例1:起始日期不在有效列表中 start_date = "2022-09-07" valid_frequency_days = ["Monday", "Friday", "Saturday"] start_date_obj = datetime.datetime.strptime(start_date, "%Y-%m-%d") if start_date_obj.strftime("%A") not in valid_frequency_days: next_valid_date = get_next_valid_date(start_date_obj, valid_frequency_days) print(f"首个有效执行日:{next_valid_date.strftime('%Y-%m-%d')}") # 输出:2022-09-09 # 示例2:任务完成后获取下一个有效日(当前有效日为周五) current_execution_date = datetime.datetime(2022, 9, 9) next_task_date = get_next_valid_date(current_execution_date, valid_frequency_days) print(f"下一个任务执行日:{next_task_date.strftime('%Y-%m-%d')}") # 输出:2022-09-10
代码说明
- 工作日映射:用字典统一工作日的数值化标准,避免字符串对比的混乱
- 有效索引排序:不管输入的有效工作日顺序如何,都按周一到周日的时间顺序排列
- 边界处理:自动处理跨周场景(比如当前是周日,有效日为周一,会直接计算出下周一)
- 复用性:
get_next_valid_date函数可直接用于起始日期校验、任务完成后获取下一个执行日等场景
内容的提问来源于stack exchange,提问作者Sony Khan
相关产品推荐
相关产品推荐

