cron 表达式是什么
cron 表达式用一组字段描述周期性执行时间,最经典的形式是五位:分钟、小时、日、月、星期。调度平台大多兼容这套写法,但在此基础上扩展了秒字段与 L、?、#、W 等符号,各实现的行为并不完全一致,这是跨平台迁移时最容易出问题的地方。
平台差异要留意的两处
一是字段个数:标准 crontab 是五位,Quartz 风格(部分平台采用)是六位或七位并从秒开始;二是「日」与「星期」同时限定时,多数实现的语义是「或」而不是「与」,会出现预期之外的多跑,不确定时只用一个字段。
基本信息
| 标准形式 | 五位:分 时 日 月 周 |
|---|---|
| 扩展形式 | 六位或七位(含秒),见于 Quartz 风格平台 |
| 常用符号 | * 任意、- 区间、, 枚举、/ 步长 |
| 扩展符号 | L 最后、? 不指定、# 第几个(平台相关) |
| 时区 | 以调度平台配置的时区为准,需与业务日期约定一致 |
字段含义
| 位置 | 字段 | 取值范围 |
|---|---|---|
| 1 | 分钟 | 0-59 |
| 2 | 小时 | 0-23 |
| 3 | 日 | 1-31 |
| 4 | 月 | 1-12 |
| 5 | 星期 | 0-7(0 与 7 通常表示周日) |
典型使用场景
- 日批任务:每天凌晨固定时间触发,处理前一天数据
- 小时级任务:整点或固定分钟触发,按小时窗口产出
- 工作日任务:只在周一到周五执行,跳过周末
- 月度任务:每月 1 日处理上月数据,避开月末日期不存在的问题
- 错峰编排:把多个大任务分散到不同分钟,避免同时争抢资源
常用表达式与含义
常用表达式与含义
0 2 * * * 每天 02:00
30 1 * * 1-5 周一到周五 01:30
0 */4 * * * 每 4 小时整点
15 3 1 * * 每月 1 日 03:15
*/10 * * * * 每 10 分钟
0 2 * * 6,0 周六与周日 02:00平台扩展写法(Quartz 风格示例)
平台扩展写法(Quartz 风格示例)
# 六位形式:秒在最前
0 0 2 * * ? 每天 02:00:00,星期字段用 ? 表示不限定
0 0 2 L * ? 每月最后一天 02:00(L 表示最后一天)
0 0 2 ? * 6#3 每月第三个星期六 02:00(# 表示第几个星期几)
# 注意:这些扩展符号在不同调度平台上含义与支持范围不同,迁移前逐条验证
# 最保险的做法:不确定的写法在测试环境用真实调度跑一遍,确认触发时间月末任务不要用「31 号触发」:2 月根本没有 31 号,直接漏跑。稳妥做法是每月 1 日触发,处理上一个自然月的数据。
平台时区与服务器时区不一致时,整个表达式的含义会整体偏移:Cron 按平台时区解释,而任务里取「当前时间」可能按服务器时区,两者叠加会出现日期错位。