在 Spring Boot 中,cron 表达式主要用于 @Scheduled 定时任务和 Quartz 调度框架。

它由 6 或 7 个字段组成(秒 分 时 日 月 周 [年])。


一、基本语法格式

秒 分 时 日 月 周 [年(可选)]
字段 允许值 允许特殊字符
0-59 , - * /
0-59 , - * /
0-23 , - * /
1-31 , - * ? / L W
1-12 或 JAN-DEC , - * /
1-7 或 SUN-SAT(1=SUN) , - * ? / L #
年(可选) 1970-2099 , - * /

二、特殊字符含义

字符 含义
* 所有值,如秒为 * 表示每秒
? 不指定值,仅用于“日”和“周”字段,互斥时使用
- 范围,如 10-12 表示 10 到 12
, 枚举,如 1,3,5
/ 增量,如 0/15 表示从 0 开始每 15 单位
L 最后(Last),如 L 在“日”表示月末最后一天
W 工作日(Weekday),如 15W 表示离 15 号最近的工作日
# 第几个星期几,如 2#3 表示第 3 个周二(周=2,月第3个)

三、常用示例

0 0 0 * * ?        # 每天 00:00:00
0 0 12 * * ?       # 每天 12:00:00
0 15 10 * * ?      # 每天 10:15:00
0 0/5 14 * * ?     # 每天 14:00 到 14:55 每5分钟
0 0/5 14,18 * * ?  # 每天 14:00-14:55 和 18:00-18:55 每5分钟
0 0 12 ? * WED     # 每周三 12:00:00
0 0 12 * * ?       # 每天中午
0 15 10 15 * ?     # 每月 15 日 10:15:00
0 0 12 1 * ?       # 每月 1 日 12:00:00
0 0 12 L * ?       # 每月最后一天 12:00:00
0 0 10 ? * 1#3     # 每月第 3 个周日(周=1,第3个)
0 0 12 ? * 2#1     # 每月第 1 个周一

四、Spring Boot 中的使用方式

1. 开启定时任务

在主类或配置类上加 @EnableScheduling

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2. 使用 @Scheduled 注解

@Component
public class MyTask {

    @Scheduled(cron = "0 0 2 * * ?")  // 每天凌晨2点执行
    public void doTask() {
        System.out.println("定时任务执行: " + new Date());
    }
}

3. 从配置文件读取 cron(推荐)

@Scheduled(cron = "${my.task.cron}")
public void doTask() {
    // ...
}

application.yml 中配置:

my:
  task:
    cron: 0 0 3 * * ?

五、注意事项

注意点 说明
日与周互斥 两者必须有一个为 ?,不能同时指定具体值
默认时区 使用系统默认时区,可通过 zone 属性指定:@Scheduled(cron = "...", zone = "Asia/Shanghai")
执行时间 方法执行完才会开始下一次,若担心堆积,可配合 @Async
不依赖年 多数情况省略“年”,即 6 位表达式
Cron 表达式在线生成 推荐使用 cron.qqe2.com 或 freeformatter.com/cron-generator 验证

六、排查问题建议

  • 未执行:检查是否加了 @EnableScheduling

  • 时间不对:检查服务器时区,或用 zone 指定

  • 表达式报错:确保日/周有一个是 ?,且字段数量为 6 或 7

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐