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实现网站可用性监控脚本

    使用Python实现网站可用性监控脚本

    这篇文章主要为大家详细介绍了如果使用Python实现一个网站可用性监控脚本,能够持续监控一个或多个网站的在线状态和响应时间,需要的朋友可以参考下
    2025-12-12
  • python包装和授权学习教程

    python包装和授权学习教程

    包装是指对一个已经存在的对象进行系定义加工,实现授权是包装的一个特性,下面这篇文章主要给大家介绍了关于python包装和授权的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • python使用Pyinstaller如何打包整个项目

    python使用Pyinstaller如何打包整个项目

    这篇文章主要介绍了python使用Pyinstaller如何打包整个项目,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • python控制台中实现进度条功能

    python控制台中实现进度条功能

    这篇文章主要介绍了python控制台中实现进度条功能的方法,想要了解的朋友可以参考一下
    2015-11-11
  • pycharm 将django中多个app放到同个文件夹apps的处理方法

    pycharm 将django中多个app放到同个文件夹apps的处理方法

    今天小编就为大家分享一篇pycharm 将django中多个app放到同个文件夹apps的处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python中os.path用法分析

    Python中os.path用法分析

    这篇文章主要介绍了Python中os.path用法,实例分析了os.path的各种常用方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • Python解析JSON数据的方法简单例子

    Python解析JSON数据的方法简单例子

    这篇文章主要给大家介绍了关于Python解析JSON数据的方法,解析JSON文件是Python中非常常见的操作,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Python编程之字符串模板(Template)用法实例分析

    Python编程之字符串模板(Template)用法实例分析

    这篇文章主要介绍了Python编程之字符串模板(Template)用法,结合具体实例形式分析了Python字符串模板的功能、定义与使用方法,需要的朋友可以参考下
    2017-07-07
  • 在Python中获取操作系统的进程信息

    在Python中获取操作系统的进程信息

    今天小编就为大家分享一篇在Python中获取操作系统的进程信息,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python 实现 pymysql 数据库操作方法

    python 实现 pymysql 数据库操作方法

    这篇文章主要介绍了python实现pymysql数据库操作方法,文章基于python的相关内容展开对 pymysql 数据库操作方法的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04

最新评论