You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. 工作日映射:用字典统一工作日的数值化标准,避免字符串对比的混乱
  2. 有效索引排序:不管输入的有效工作日顺序如何,都按周一到周日的时间顺序排列
  3. 边界处理:自动处理跨周场景(比如当前是周日,有效日为周一,会直接计算出下周一)
  4. 复用性:get_next_valid_date函数可直接用于起始日期校验、任务完成后获取下一个执行日等场景

内容的提问来源于stack exchange,提问作者Sony Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:25:46