Cron 时间表达式详解

Cron 时间表达式详解

Cron 是一种定时任务调度方式,常用于 Unix/Linux 系统,也可以在许多 CI/CD 工具、调度程序(如 Kubernetes、GitHub Actions 等)中使用。它的时间表达式由 5 个或 6 个字段 组成,用于指定任务的执行时间。

1. Cron 表达式的基本格式

通常,Cron 表达式包含 5 个时间字段(在某些环境下可能有 6 个字段),格式如下:

┌──────── 分钟 (0 - 59)
│  ┌────── 小时 (0 - 23)
│  │  ┌──── 每月的哪一天 (1 - 31)
│  │  │  ┌── 月份 (1 - 12)
│  │  │  │  ┌ 星期几 (0 - 7, 0 和 7 代表周日)
│  │  │  │  │
*  *  *  *  *

如果环境支持 字段(如 Quartz),则会变成 6 个字段:

秒 分钟 小时 日期 月份 星期

2. 各字段的含义

字段允许的值含义
分钟0-59任务执行的具体分钟
小时0-23任务执行的具体小时(24 小时制)
日期1-31任务执行的具体日期
月份1-12任务执行的月份
星期0-7任务执行的星期几(07 代表周日,1-6 代表周一到周六)

3. Cron 表达式的常用写法

表达式解释
0 12 * * *每天中午 12:00 触发
0 0 * * *每天午夜 00:00 触发
*/5 * * * *每 5 分钟执行一次
0 8,20 * * *每天 08:00 和 20:00 触发
0 9-17 * * *每天 09:00 到 17:00(每小时执行一次)
0 12 1 * *每月 1 号中午 12:00 触发
0 0 * * 0每周日午夜 00:00 触发
0 0 1 1 *每年 1 月 1 号 00:00 触发

4. 特殊符号用法

Cron 支持一些特殊符号,让调度更灵活:

符号作用示例解释
*任意值0 * * * *每小时的第 0 分钟执行
,多个值0 9,12,18 * * *每天 9:00、12:00 和 18:00 触发
-范围0 9-17 * * *每天 09:00 到 17:00 每小时触发
/间隔*/10 * * * *每 10 分钟执行一次
?任何值(仅用于日期和星期字段)0 12 * * ?每天中午 12:00 触发(不指定星期几)
L最后一天(仅用于日期和星期)0 0 L * *每月最后一天 00:00 触发
W最近的工作日(仅用于日期)0 8 15W * *每月 15 号最近的工作日 08:00 触发
#每月的第几个星期几0 0 * * 2#1每月的第一个星期二 00:00 触发

5. 进阶示例

表达式解释
*/15 9-17 * * 1-5工作日 09:00-17:00 之间每 15 分钟执行一次
0 22 * * 1-5每周一到周五的 22:00 触发
0 0 1 * 1每月 1 号且是星期一的午夜 00:00 触发
0 8-18/2 * * *每天 08:00 到 18:00 之间,每 2 小时执行一次
0 0 L * *每月最后一天 00:00 触发
0 0 * * 6,0每周六和周日午夜 00:00 触发

6. 注意事项

  1. 星期和日期不能同时指定:例如 0 12 15 * 3(每月 15 号且是星期三)不会生效,应该使用 ? 代替其中一个字段,如 0 12 15 * ?(每月 15 号)。
  2. 考虑时区:Cron 默认使用服务器时区,需要理解时区差异,或者使用 TZ 变量指定时区。
  3. 避免高频任务:例如 * * * * *(每分钟执行)可能会造成资源占用过高,应避免在高负载环境中使用。

7. 结论

  • 基本格式分 时 日 月 周
  • 常见写法0 12 * * *(每天中午 12:00)
  • 特殊符号
    • *(任意值)
    • ,(多个值)
    • -(范围)
    • /(间隔)
    • L(最后一天)
    • W(最近的工作日)
    • #(每月第几个星期几)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注