Python使用APScheduler设置每月固定日期运行的定时任务

 更新时间:2026年01月21日 08:39:15   作者:幸福清风  
在开发自动化脚本或后台服务时,我们经常需要让某些任务按照特定的时间周期自动执行,Python 的 APScheduler(Advanced Python Scheduler)库是一个强大且灵活的工具,能够轻松地帮助我们实现这些需求,下面我们就来看看具体实现方法吧

在开发自动化脚本或后台服务时,我们经常需要让某些任务按照特定的时间周期自动执行。例如,每月初生成报告、每月末清理日志文件,或者在每月的某个特定日期发送通知。Python 的 APScheduler(Advanced Python Scheduler)库是一个强大且灵活的工具,能够轻松地帮助我们实现这些需求。

本文将详细介绍如何利用 APScheduler 的 Cron 触发器(CronTrigger)来设置每月固定日期运行的定时任务。

1. 理解 Cron 表达式与 APScheduler

APScheduler 提供了多种触发器类型,其中 CronTrigger 最适合处理复杂的周期性任务。它借鉴了 Unix/Linux 系统中的 Cron 表达式概念,但提供了更友好的 Python 接口。

一个典型的 Cron 表达式由六个(或七个)字段组成,分别代表秒、分、时、日(月)、月、周(日)、年(可选)。在 APScheduler 中,我们通常只需要关注前五个字段:

  • second (秒)
  • minute (分钟)
  • hour (小时)
  • day (日,即每月的第几天)
  • month (月)
  • day_of_week (周,即一周的第几天)

要设置每月固定日期运行,关键在于正确配置 day 参数。

2. 环境准备

首先,确保你已经安装了 APScheduler 库。如果尚未安装,请使用 pip 进行安装:

pip install apscheduler

3. 核心实现:设置每月固定日期

我们将通过几个具体的例子来展示不同的设置方法。

示例 1:每月特定一天运行

这是最常见的场景。假设我们需要在每月 15 号的上午 9:00 执行一个任务。

from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler # 导入阻塞型调度器

def my_monthly_task():
    """
    定义一个简单的任务函数
    """
    current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"【任务执行】 - 当前时间: {current_time}")
    # 在这里放置你的实际业务逻辑
    # 例如:generate_report(), send_email(), cleanup_logs() 等

# --- 步骤 1: 创建调度器实例 ---
# BlockingScheduler 适用于脚本运行,它会阻塞主线程
scheduler = BlockingScheduler()

# --- 步骤 2: 添加定时任务 ---
scheduler.add_job(
    func=my_monthly_task,      # 要执行的函数对象
    trigger='cron',            # 指定使用 Cron 触发器
    day=15,                    # <--- 关键:指定每月的第15天
    hour=9,                    # 指定在 9 点执行
    minute=0,                  # 指定在 0 分执行
    id='monthly_task_15th'     # (可选) 为任务指定一个唯一ID,方便管理
)

print("定时任务已添加:每月15号上午9:00执行。")

# --- 步骤 3: 启动调度器 ---
try:
    print("调度器已启动,等待任务执行...")
    scheduler.start() # 启动调度器,程序会在此处保持运行状态
except KeyboardInterrupt:
    print("\n接收到中断信号,调度器已关闭。")
    scheduler.shutdown(wait=True) # 平滑关闭调度器

在这个例子中,day=15 明确指定了任务只会在每个月的 15 号运行。需要注意的是,如果你设置 day=31,而当月没有 31 号(如 2 月),那么该月的任务将不会被触发。

示例 2:每月特定几天运行

有时,我们需要在每月的多个固定日期都执行任务。例如,每月 1 号和 15 号。这时,我们可以将 day 参数设置为列表 [1, 15] 或逗号分隔的字符串 '1,15'

# ... (导入和函数定义同上)

# 添加任务:每月1号和15号的上午9:00执行
scheduler.add_job(
    func=my_monthly_task,
    trigger='cron',
    day='1,15',               # <--- 指定每月的1号和15号
    # 或者: day=[1, 15],
    hour=9,
    minute=0,
    id='monthly_task_1st_and_15th'
)

print("定时任务已添加:每月1号和15号上午9:00执行。")

# ... (启动调度器)

示例 3:每月最后一天运行

对于月末操作,比如备份数据或结算,我们可能需要在每月的最后一天执行任务。APScheduler 提供了便捷的表达方式 day='last'

# ... (导入和函数定义同上)

# 添加任务:每月最后一天的上午9:00执行
scheduler.add_job(
    func=my_monthly_task,
    trigger='cron',
    day='last',               # <--- 指定每月的最后一天
    hour=9,
    minute=0,
    id='monthly_task_last_day'
)

print("定时任务已添加:每月最后一天上午9:00执行。")

# ... (启动调度器)

这种方式非常智能,它能自动识别不同月份以及闰年的天数差异。

示例 4:每月特定周几(如每月第一个周一)

除了按日期,我们有时还需要按“第 X 个周 Y”来安排任务。例如,每月第一个周一。APScheduler 也支持这种表达。

# ... (导入和函数定义同上)

# 添加任务:每月第一个周日的上午9:00执行
# 注意:day_of_week='sun' 代表周日,'mon' 代表周一,以此类推
scheduler.add_job(
    func=my_monthly_task,
    trigger='cron',
    day='1st sun',            # <--- 指定每月的第一个周日 ('1st' for first, '2nd' for second, etc.)
    hour=9,
    minute=0,
    id='monthly_task_first_sunday'
)

print("定时任务已添加:每月第一个周日上午9:00执行。")

# ... (启动调度器)

类似的,'2nd mon' 表示每月第二个周一,'3rd tue' 表示每月第三个周二,等等。如果某个月份不满足条件(例如某月没有第五个周日),则该月的任务不会执行。

4. 总结

通过 APSchedulerCronTrigger,我们可以非常灵活地配置各种周期性任务。

  • day=N: 每月 N 号。
  • day='N,M'day=[N, M]: 每月 N 号和 M 号。
  • day='last': 每月最后一天。
  • day='last-N': 每月倒数第 N 天。
  • day='1st mon', day='2nd tue': 每月第一个周一,第二个周二等。

结合 hourminute 等参数,可以精确控制任务在每天的具体时刻执行。

到此这篇关于Python使用APScheduler设置每月固定日期运行的定时任务的文章就介绍到这了,更多相关Python APScheduler定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现dbscan算法

    python实现dbscan算法

    DBSCAN 算法是一种基于密度的空间聚类算法,本文主要介绍了python实现dbscan算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Python实现考试自动答题的脚本分享

    Python实现考试自动答题的脚本分享

    最近这段时间天气正正好,不冷不热,是学习考驾照的好时机。为了帮助大家能够顺利获得驾照,小编为大家准备了驾照考试的自动答题小程序,希望对大家有所帮助
    2023-03-03
  • python列表倒序的几种方法(切片、reverse()、reversed())

    python列表倒序的几种方法(切片、reverse()、reversed())

    本文主要介绍了python列表倒序的几种方法(切片、reverse()、reversed()),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • python字典操作实例详解

    python字典操作实例详解

    这篇文章主要为大家详细介绍了python字典操作实例的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • windows上安装python3教程以及环境变量配置详解

    windows上安装python3教程以及环境变量配置详解

    这篇文章主要介绍了windows上安装python3教程以及环境变量配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python实现自动化办公邮件合并功能

    python实现自动化办公邮件合并功能

    这篇文章主要介绍了python实现自动化办公邮件合并功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 详解用Python进行时间序列预测的7种方法

    详解用Python进行时间序列预测的7种方法

    这篇文章主要介绍了详解用Python进行时间序列预测的7种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 手把手带你了解Python数据分析--matplotlib

    手把手带你了解Python数据分析--matplotlib

    这篇文章主要介绍了Python实现matplotlib显示中文的方法,结合实例形式详细总结分析了Python使用matplotlib库绘图时显示中文的相关操作技巧与注意事项,需要的朋友可以参考下
    2021-08-08
  • Python判断三段线能否构成三角形的代码

    Python判断三段线能否构成三角形的代码

    这篇文章主要介绍了Python判断三段线能否构成三角形的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python爬虫基础知识点整理

    python爬虫基础知识点整理

    在本篇文章里小编给大家整理的是一篇关于python爬虫基础知识点整理内容,有兴趣的朋友们可以学习下。
    2020-06-06

最新评论