前言

这次软件工程综合实践,在IDEA下搭建Spring Boot框架作为后端。过程中使用了注解@EnableScheduling@Scheduled来实现定时执行某操作的功能。其中可能会用到Cron表达式来规定程序段运行的时间点。这篇文章就来介绍一下Cron表达式的规则和使用

参考博客:【Java定时任务】浅谈CronTrigger的用法和在线Cron表达式生成网址_紫陌520的博客-CSDN博客

介绍
  • Cron表达式是由子表达式组成的字符串,描述了时间表的具体信息
  • 格式:[秒] [分] [时] [日] [月] [周] [年]
  • 其中年可以省略,其余项不可省略
  • 每个子表达式的规则不完全相同,见下表
字段 是否必填 允许值 允许的特殊字符
0~59 , - * /
0~59 , - * /
0~23 , - * /
1~31 , - * ? / L W C
1~12 / JAN~DEC , - * /
1~7 / SUN~MON , - * ? / L C #
Empty / 1970~2099 , - * /

其中特殊字符的含义如下

  • " * “:表示所有值——例如在分的字段上设置” * ",表示每一分钟都会触发
  • " ? “:表示不指定值——使用的场景为不需要关心当前设置的这个字段的值。例如要在每月的10号触发一个操作,但不关心是周几,那么就需要在周的字段上置为” ? “,具体赋值为” 0 0 0 10 * ?"
  • " - “:表示区间——例如在时字段上设置"10-12”,表示10,11,12点都会触发这个操作
  • " , “:表示指定多个值——例如在周字段上设置"MON,WED,FRI”,表示周一,周三和周五触发
  • " / “:用于递增触发——例如在秒字段上设置"5/15”,表示从5秒开始,每增加15秒就会触发一次,即(5,20,35,50);在日字段上设置"1/3"表示从每月1号开始,每隔3天执行一次
  • " L ":表示最后触发(只能用在日和周字段)——例如设置在日字段上,表示当月的最后一天触发;设置在周字段上,表示每周的最后一天即周六触发;“L"可和数字一起使用,在"L"前加上数字,则表示该数据的最后一个,例如在周字段上设置为"6L”,表示本月的最后一个星期五
  • " W “:表示离指定日期最近的工作日(只能用在日字段)——例如在日字段上设置"15W”,表示在离每月15号最近的那个工作日触发如果15号是周六,则在最近的工作日即14号星期五触发;如果15号是周日,则在最近的工作日即16号周一触发;如果刚好是工作日,则15号当天触发-"W"前只能设置具体的数字,不允许使用区间;"W"不会跨月执行,如果设置日字段为"1W"且1号不是工作日,则会在1号之后找最近的工作日触发,同理在月末只会找月末之前的工作日触发
  • " # “:序号(表示每月的第几个周几-只能在周字段设置)——例如在周字段上设置"6#3”,表示在每月的第三个周六触发(可用在母亲节和父亲节时触发)
  • " C ":(只能用在日和周字段)

Cron表达式举例

  • 每隔5秒执行一次:*/5 * * * * ?
  • 每隔1分钟执行一次:0 */1 * * * ?
  • 每天23点执行一次:0 0 23 * * ?
  • 每天凌晨1点执行一次:0 0 1 * * ?
  • 每月1号凌晨1点执行一次:0 0 1 1 * ?
  • 每月最后一天23点执行一次:0 0 23 L * ?
  • 每周星期天凌晨1点实行一次:0 0 1 ? * L
  • 在26分、29分、33分执行一次:0 26,29,33 * * * ?
  • 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?