在 Java 开发中,cron 表达式(Cron Expression)是一种时间规则字符串,用来定义“什么时候执行任务”。
它最初来自 Unix 的cron定时器,后来被 Spring、Quartz、ScheduledThreadPoolExecutor 等 Java 调度框架直接借用,成为事实标准。
1. 格式(6 或 7 段,空格分隔)
| 段 | 含义 | 取值范围 | 允许的特殊符 |
|---|---|---|---|
| 1 | 秒(Spring/Quartz 支持) | 0–59 | , - * / |
| 2 | 分 | 0–59 | , - * / |
| 3 | 时 | 0–23 | , - * / |
| 4 | 日 | 1–31 | , - * / L W C |
| 5 | 月 | 1–12 或 JAN–DEC | , - * / |
| 6 | 星期 | 0–7(0 和 7 都是周日)或 SUN–SAT | , - * / L # C |
| 7 | 年(可选,Quartz 支持) | 1970–2099 | , - * / |
Spring 的
@Scheduled默认6 段:秒 分 时 日 月 星期
Linux 原生crontab只有5 段:分 时 日 月 星期
2. 常用示例(Spring 6 段)
| 表达式 | 含义 |
|---|---|
0 0 2 * * * | 每天凌晨 2 点 |
0 30 9 * * MON-FRI | 工作日早上 9:30 |
0 */10 * * * * | 每 10 秒一次 |
0 0 0 1 * * | 每月 1 号零点 |
0 0 22 * * 1-5 | 周一到周五晚上 10 点 |
0 0 8 L * * | 每月最后一天上午 8 点 |
0 0 8 * * 1#1 | 每月第一个周一上午 8 点 |
3. 在 Java 中的使用场景
Spring 原生
@Scheduled(cron = "0 15 10 * * *") public void report() { ... }Quartz
CronScheduleBuilder.cronSchedule("0 30 9 ? * MON-FRI")验证/解析工具
org.springframework.scheduling.support.CronExpression(Spring 5.3+)org.quartz.CronExpression
4. 快速记忆口诀
秒 分 时 日 月 星期,
从左到右,空格分隔;*表示“每”,,列举,-区间,/步长;L最后,#第几,W工作日。
5. 在线生成/验证工具
- https://cron.qqe2.com
- https://crontab.guru
一句话总结:
cron 表达式就是 Java 世界里描述“什么时候跑任务”的“时间正则”——写对 6 段,任务按时跑。