Appearance
Cron 表达式语法指南
来源: 网络资料整理
整理日期: 2026-03-24
概述
Cron 表达式是 Unix/Linux 系统中用于定时任务调度的标准语法,广泛应用于 crontab、Quartz Scheduler、AWS EventBridge 等各种调度系统。它是一个由空格分隔的字符串,通过特定格式定义任务的执行时间规则。
表达式结构
标准 5 字段格式(Linux/Unix crontab)
* * * * *
│ │ │ │ │
│ │ │ │ └── 星期 (0-7, 0 和 7 都表示周日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小时 (0-23)
└────────── 分钟 (0-59)扩展 6/7 字段格式(Quartz 等框架)
* * * * * * [Year]
│ │ │ │ │ │
│ │ │ │ │ └── 星期 (1-7 或 SUN-SAT)
│ │ │ │ └──── 月份 (1-12)
│ │ │ └────── 日期 (1-31)
│ │ └──────── 小时 (0-23)
│ └────────── 分钟 (0-59)
└──────────── 秒 (0-59)特殊字符详解
| 字符 | 名称 | 含义 | 示例 |
|---|---|---|---|
* | 星号 | 匹配任意值 | * * * * * 每分钟执行 |
, | 逗号 | 列表分隔,指定多个值 | 0,30 * * * * 每小时的 0 分和 30 分执行 |
- | 连字符 | 指定范围 | 9-17 * * * * 9 点到 17 点每小时执行 |
/ | 斜杠 | 步长,指定间隔 | */5 * * * * 每 5 分钟执行 |
? | 问号 | 不指定(用于解决日期和星期冲突) | 0 0 1 * ? 每月 1 号执行,不关心星期几 |
L | Last | 最后 | 0 0 L * * 每月最后一天执行 |
W | Weekday | 最近工作日 | 0 0 15W * * 每月 15 日最近的工作日 |
# | 井号 | 第几个星期几 | 0 0 * * 1#2 每月第 2 个周一 |
常用示例
基础周期
cron
# 每分钟执行
* * * * *
# 每 5 分钟执行
*/5 * * * *
# 每小时执行(整点)
0 * * * *
# 每 2 小时执行
0 */2 * * *每日任务
cron
# 每天凌晨 2 点执行
0 2 * * *
# 每天早上 8 点 30 分执行
30 8 * * *
# 每天中午 12 点和晚上 6 点执行
0 12,18 * * *每周/每月任务
cron
# 每周一早上 8 点执行
0 8 * * 1
# 每月 1 号凌晨执行
0 0 1 * *
# 每月最后一个周五下午 5 点执行
0 17 * * 5L工作日任务
cron
# 工作日(周一到周五)每天早上 9 点执行
0 9 * * 1-5
# 工作日每 2 小时执行
0 */2 * * 1-5平台差异说明
| 平台 | 字段数 | 星期范围 | 特殊说明 |
|---|---|---|---|
| Linux crontab | 5 | 0-7 (0/7=周日) | 标准 Unix 格式 |
| Quartz (Java) | 6 或 7 | 1-7 (1=周日) | 包含秒和可选年份 |
| AWS EventBridge | 6 | 1-7 (1=周日) | 支持年字段 |
| Spring Scheduler | 6 | 0-6 (0=周日) | 类似 Quartz |
重要注意事项
1. 日期与星期的冲突
当同时指定了日期和星期时,它们之间是**"或"**的关系。如果只想按其中一个条件触发,另一个字段应使用 ? 表示不指定。
cron
# 错误:每月 1 号且是周一才执行(很少符合预期)
0 0 1 * 1
# 正确:每月 1 号执行(不管星期几)
0 0 1 * ?
# 正确:每周一执行(不管几号)
0 0 ? * 12. 时区问题
Cron 表达式本身不包含时区信息,实际执行时间取决于运行环境的系统时区。在分布式系统或云服务中,务必确认:
- 服务器时区设置
- 容器/函数计算的默认时区
- 是否需要显式指定时区
3. 执行频率限制
- 最小粒度通常为 1 分钟(标准 crontab)
- 部分系统支持秒级调度(如 Quartz)
- 过于频繁的调度(如每秒执行)可能导致性能问题
验证工具推荐
- crontab.guru - 可视化解释 Cron 表达式
- cron-expression-descriptor - 将 Cron 转换为人类可读文本