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

如何在Python schedule模块中仅在工作日执行任务?

如何在Python schedule模块中仅在工作日执行任务

嘿,我完全懂你现在的困扰——手动重复定义周一到周五的任务真的太繁琐了!其实有几种更优雅的方式来实现仅工作日执行的需求,不用一遍遍复制粘贴代码。下面分享两种实用的方法:

方法一:任务内添加工作日判断(简单快捷)

这种方法的思路是保持原有的每日调度,但在任务执行前先检查当天是否为工作日,非工作日直接跳过执行逻辑。

首先写一个辅助函数判断是否为工作日:

from datetime import datetime

def is_workday():
    # weekday() 返回0=周一,4=周五,小于5就是工作日
    return datetime.today().weekday() < 5

然后修改你的任务函数,添加判断:

def turn_on():
    if not is_workday():
        return  # 非工作日直接返回,不执行后续逻辑
    # 这里写你的turn_on实际操作
    print("设备已开启")

def turn_off():
    if not is_workday():
        return
    # 这里写你的turn_off实际操作
    print("设备已关闭")

最后只需要定义一次每日调度即可:

import schedule

schedule.every().day.at("06:00").do(turn_on)
schedule.every().day.at("07:40").do(turn_off)
schedule.every().day.at("16:05").do(turn_on)
schedule.every().day.at("21:05:00").do(turn_off)

优点:代码改动最小,快速实现需求;缺点:非工作日时任务依然会被调度触发,只是不执行核心逻辑(对大多数场景来说影响不大)。

方法二:批量创建工作日任务(精准调度)

如果你希望任务只在工作日被调度,根本不会在周末触发,可以通过循环批量给周一到周五添加任务,避免重复代码:

import schedule

# 定义工作日列表
workdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]

# 批量添加任务
for day in workdays:
    # 获取对应工作日的调度器
    daily_schedule = getattr(schedule.every(), day)
    daily_schedule.at("06:00").do(turn_on)
    daily_schedule.at("07:40").do(turn_off)
    daily_schedule.at("16:05").do(turn_on)

# 21:05的任务如果也是仅工作日执行,同样可以放进循环
for day in workdays:
    getattr(schedule.every(), day).at("21:05:00").do(turn_off)

优点:仅在工作日创建调度任务,周末完全不会触发;缺点:代码比方法一多一点,但胜在精准。

额外补充:处理节假日

如果需要排除法定节假日,可以扩展is_workday函数,维护一个节假日日期列表,结合判断:

# 示例节假日列表,格式为YYYY-MM-DD
holidays = ["2024-10-01", "2024-10-02"]

def is_workday():
    today = datetime.today().strftime("%Y-%m-%d")
    return datetime.today().weekday() < 5 and today not in holidays

这样就能同时排除周末和指定节假日了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:22:45