Cron 表达式语法详解
Cron 表达式是用于配置定时任务的时间表达式,广泛应用于 Linux 系统的 crontab、Spring Boot 的 @Scheduled 注解、以及各种任务调度框架中。掌握 Cron 表达式是后端开发的基本功。
Cron 表达式格式
标准 Cron 表达式由 6-7 个字段组成,用空格分隔:
┌───────────── 秒 (0-59)
│ ┌───────────── 分 (0-59)
│ │ ┌───────────── 时 (0-23)
│ │ │ ┌───────────── 日 (1-31)
│ │ │ │ ┌───────────── 月 (1-12)
│ │ │ │ │ ┌───────────── 星期 (0-7, 0和7都是周日)
│ │ │ │ │ │
* * * * * *
注意:标准 Linux crontab 只有 5 个字段(没有秒),Spring Boot 和 Quartz 支持 6-7 个字段。
特殊字符说明
| 字符 | 含义 | 示例 |
|---|---|---|
* |
所有值 | * * * * * 每分钟 |
, |
列举多个值 | 1,3,5 第1、3、5 |
- |
范围 | 1-5 第1到第5 |
/ |
步长 | */5 每隔5个单位 |
? |
不指定(仅日和星期) | ? |
L |
最后一天 | L 月末 |
W |
最近的工作日 | 15W 离15号最近的工作日 |
# |
第几个星期几 | 2#3 第3个星期一 |
常用 Cron 表达式示例
基础频率
| 表达式 | 含义 |
|---|---|
0 * * * * * |
每分钟的第0秒执行 |
0 0 * * * * |
每小时执行 |
0 0 0 * * * |
每天 midnight 执行 |
0 0 0 * * 1 |
每周一 midnight 执行 |
0 0 0 1 * * |
每月1号 midnight 执行 |
常用业务场景
| 表达式 | 含义 |
|---|---|
0 0/5 * * * * |
每5分钟执行一次 |
0 0 9-18 * * 1-5 |
工作日 9:00-18:00 每小时执行 |
0 0 2 * * ? |
每天凌晨2点执行 |
0 30 8 ? * 1-5 |
工作日早上8:30执行 |
0 0 0 1,15 * ? |
每月1号和15号 midnight 执行 |
0 0 12 ? * 6L |
每月最后一个周五中午12点 |
0 0 0 ? * 6#3 |
每月第3个周五 midnight 执行 |
间隔执行
| 表达式 | 含义 |
|---|---|
0/10 * * * * * |
每10秒执行一次 |
0 0/30 * * * * |
每30分钟执行一次 |
0 0 */2 * * * |
每2小时执行一次 |
Spring Boot 中使用 Cron
@Scheduled 注解
@Component
public class ScheduledTasks {
// 每天凌晨2点执行
@Scheduled(cron = "0 0 2 * * ?")
public void dailyTask() {
System.out.println("每日定时任务执行");
}
// 工作日每小时执行
@Scheduled(cron = "0 0 9-18 ? * 1-5")
public void workdayHourly() {
System.out.println("工作日定时任务执行");
}
// 每5分钟执行一次
@Scheduled(cron = "0 0/5 * * * ?")
public void everyFiveMinutes() {
System.out.println("每5分钟任务执行");
}
}
启用定时任务
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Linux Crontab 使用
# 编辑 crontab
crontab -e
# 每天凌晨3点备份数据库
0 3 * * * /opt/scripts/backup.sh
# 每周一早上9点发送周报
0 9 * * 1 /opt/scripts/weekly-report.sh
# 每隔10分钟检查服务状态
*/10 * * * * /opt/scripts/health-check.sh
# 查看当前 crontab
crontab -l
常见问题
Q: 日和星期字段冲突怎么办?
当日和星期都指定具体值时,Cron 采用"或"逻辑——满足任一条件即触发。例如 0 0 12 1 * 1 会在每月1号或每周一的中午12点执行。使用 ? 可以避免歧义。
Q: Cron 表达式的时区如何设置?
Spring Boot 中可以指定时区:
@Scheduled(cron = "0 0 9 * * ?", zone = "Asia/Shanghai")
Q: 如何测试 Cron 表达式?
推荐使用 jsjson.com Cron 表达式工具 在线测试,输入表达式即可预览未来 10 次执行时间。
总结
Cron 表达式简洁而强大,是定时任务调度的标准方式。掌握其语法和常用模式,可以高效地配置各种定时任务。建议使用在线工具验证表达式的正确性,避免因语法错误导致任务未按预期执行。
本文最后更新于 2026 年 5 月