Cron 表达式语法详解

全面讲解Cron表达式的语法格式、常用示例、特殊符号含义,以及在Spring Boot、Linux crontab中的实际应用。

日期时间 2026-05-27 8 分钟

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 月

📚 相关文章