Quartz Cron表达式结构
Quartz Cron通常由6个必填字段和1个可选年份字段组成。与Linux Crontab不同,它的第一段是秒,因此不能直接把五段表达式复制到Quartz中使用。
秒 分 时 日 月 周 [年]
0 30 9 ? * MON-FRI * | 字段 | 范围 | 常用字符 |
|---|---|---|
| 秒 | 0–59 | * , - / |
| 分钟 | 0–59 | * , - / |
| 小时 | 0–23 | * , - / |
| 日期 | 1–31 | * ? , - / L W |
| 月份 | 1–12或JAN–DEC | * , - / |
| 星期 | 1–7或SUN–SAT | * ? , - / L # |
| 年份 | 1970–2199 | * , - / |
Quartz中日期和星期通常不能同时限定。需要按星期执行时,把日期写成
?;需要按具体日期执行时,把星期写成 ?。Quartz特殊字符
问号(?)
问号只用于日期或星期字段,表示“不指定”。例如 0 0 9 ? * MON-FRI 表示周一至周五上午9点,日期字段不参与判断。
L:最后
日期字段中的 L 表示当月最后一天;L-2 表示倒数第3天。星期字段中的 6L 可表示当月最后一个星期五。
W:最近工作日
15W 表示距离15日最近的周一至周五。如果15日是星期六,通常选择14日星期五;如果是星期日,通常选择16日星期一,并且不会跨月。
#:第几个星期几
MON#2 表示当月第二个星期一,适合工资结算、月度报表和固定周次会议。
Quartz常用表达式
| 表达式 | 含义 | 验证 |
|---|---|---|
0 0/5 * * * ? | 每5分钟 | 计算时间 |
0 0 12 * * ? | 每天12点 | 计算时间 |
0 0 9 ? * MON-FRI | 工作日上午9点 | 计算时间 |
0 0 9 L * ? | 每月最后一天9点 | 计算时间 |
0 30 9 ? * MON#2 | 每月第二个星期一9:30 | 计算时间 |
常见错误
- 把Linux五段表达式直接用于Quartz,导致秒、分钟和小时整体错位。
- 日期与星期同时填写具体值,没有使用问号解除其中一个限制。
- 把星期编号按照Linux的0–6理解,而Quartz通常采用1–7。
- 只检查语法是否通过,没有结合时区和未来运行时间验证真实结果。
最佳实践是同时保存表达式类型和时区,而不只是保存表达式字符串。