定时任务 - CronUtil / CronPattern¶
由来¶
定时任务是后端开发的常见需求。CronUtil 提供了基于 Cron 表达式的定时任务调度功能。
CronUtil¶
from hutool import CronUtil
# 注册定时任务
CronUtil.schedule("0 */5 * * *", lambda: print("每5分钟执行一次"))
CronUtil.schedule("0 9 * * 1-5", lambda: print("工作日9点执行"))
# 固定频率执行
CronUtil.schedule_at_fixed_rate(lambda: print("每10秒"), period_seconds=10)
# 停止/重启
CronUtil.stop()
CronUtil.restart()
# setCronSetting — 加载 Cron 配置文件
CronUtil.set_cron_setting("/path/to/cron.properties")
# updatePattern — 更新 Cron 表达式
CronUtil.update_pattern("0 */10 * * *") # 改为每 10 分钟
CronPattern¶
Cron 表达式解析和匹配:
from hutool import CronPattern
# 创建 Cron 表达式
pattern = CronPattern("0 9 * * 1-5") # 工作日9点
# 判断当前时间是否匹配
from datetime import datetime
pattern.match(datetime.now())
# 获取下一次匹配时间
next_time = pattern.next_match_time()
Cron 表达式格式¶
┌───────────── 分 (0-59)
│ ┌───────────── 时 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 周 (0-7, 0和7都是周日)
│ │ │ │ │
* * * * *
常用表达式¶
表达式 |
含义 |
|---|---|
|
每5分钟 |
|
每天9点 |
|
工作日9点 |
|
每月1号0点 |
|
每10秒(特殊支持) |
CronValidator¶
Quartz 风格 6-7 字段 Cron 表达式校验:
from hutool import CronValidator
# 整体校验
CronValidator.validate("0 0 12 * * ?") # True — 每天中午
CronValidator.validate("0 0/5 14 * * ?") # True — 14:00 起每5分钟
CronValidator.validate("0 15 10 ? * 6L") # True — 每月最后一个周五
CronValidator.validate("0 15 10 ? * 6#3") # True — 第三个周五
# 便捷方法
CronValidator.is_valid("0 0 12 * * ?") # True
CronValidator.is_valid(None) # False
CronValidator.is_valid("") # False
# 单字段校验
CronValidator.validate_second_or_minute("0/5") # True
CronValidator.validate_hour("9,12,18") # True
CronValidator.validate_day("15W") # True — 最近工作日
CronValidator.validate_week("6#3") # True — 第三个周五
字段格式¶
┌───────────── 秒 (0-59)
│ ┌───────────── 分 (0-59)
│ │ ┌───────────── 时 (0-23)
│ │ │ ┌───────────── 日 (1-31, ? L W)
│ │ │ │ ┌───────────── 月 (1-12)
│ │ │ │ │ ┌───────────── 周 (1-7, ? L #)
│ │ │ │ │ │ ┌───────────── 年 (可选, 1970-2099)
│ │ │ │ │ │ │
* * * * * * *
特殊字符¶
字符 |
说明 |
示例 |
|---|---|---|
|
匹配任意值 |
|
|
不指定(日/周字段) |
|
|
范围 |
|
|
枚举 |
|
|
步长 |
|
|
最后 |
|
|
最近工作日 |
|
|
第几个星期几 |
|