@Scheduled的cron表达式

发布时间 2023-09-09 11:39:10作者: theSummerDay

@Scheduled生效条件

启动类加上注解@EnableScheduling
定时任务的类加上注解@Component@Service
定时任务的方法加上注解@Scheduled

cron表达式

  ┌───────────── second (0-59)
  │ ┌───────────── minute (0 - 59)
  │ │ ┌───────────── hour (0 - 23)
  │ │ │ ┌───────────── day of the month (1 - 31)
  │ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)
  │ │ │ │ │ ┌───────────── day of the week (0 - 7)
  │ │ │ │ │ │          (0 or 7 is Sunday, or MON-SUN)
  │ │ │ │ │ │
  * * * * * *

L: 表示last最后一个,在不同的字段中含义不一样

  1. 在第4个字段day of month中表示月的最后一天,如果L后面有一个负数(L-n)表示该月的第n天到最后一天
  2. 在第6个字段day of week中表示周的最后一天,如果前缀有数字或3个字母,即 dL 或 DDDL 表示该月的最后一个周几, 1L 或 MONL 表示该月的最后一个周一

W: 工作日,用在第4个字段中,如果前缀是一个数字,即nW,表示距离天n最近的工作日,LW表示该月的最后一个工作日
示例: 9W 表示距离9号最近的工作日

  1. 如果9号是工作日,那就9号执行
  2. 如果9号是周六那就提前到周五8号执行
  3. 如果9号是周日,那就推迟到周一10号执行
    注意: 如果n是1,且1号是周六,也会推迟到周一执行,即1W表示每月的第1个工作日

#: 用在第6个字段上,形式可以是 d#n 或 DDD#n表示第n个周几, 如 1#2 或 MON#2 表示该月的第2个周一

示例

0 0 * * * * : 每个整点
*/10 * * * * * : 每10秒
0 0 8-10 * * * : 每天的8,9,10整点
0 0 6,19 * * * : 每天的6点整,19点整
0 0/30 8-10 * * * : 每天当小时是8~10时,每30分钟执行一次,即 8:00, 8:30, 9:00, 9:30, 10:00 和 10:30
0 0 9-17 * * MON-FRI : 周一到周五期间每天的9点到17点的整点
0 0 0 25 12 ? : 每年的12月25号的零点
0 0 0 L * * : 每月最后一天的零点
0 0 0 L-3 * * : 每月的第3天到最后1天的零点
0 0 0 1W * * : 每月第一个工作日的零点
0 0 0 LW * * : 每月最后一个工作日的零点
0 0 0 * * 5L : 每月最后一个周五的零点
0 0 0 * * THUL : 每月最后一个周四的零点
0 0 0 ? * 5#2 : 每月的第2个周五的零点
0 0 0 ? * MON#1 : 每月第1个周一的零点

宏指令

The following macros are also supported:
"@yearly" (or "@annually") to run un once a year, i.e. "0 0 0 1 1 *",
"@monthly" to run once a month, i.e. "0 0 0 1 * *",
"@weekly" to run once a week, i.e. "0 0 0 * * 0",
"@daily" (or "@midnight") to run once a day, i.e. "0 0 0 * * *",
"@hourly" to run once an hour, i.e. "0 0 * * * *".

例如 @Scheduled(cron = "@hourly") 等效于 @Scheduled(cron = "0 0 * * * *")

参考

类:org.springframework.scheduling.support.CronExpression 方法:parse()的注释
CronExpression.parse()