在开发过程中经常需要使用定时任务在特定的时间执行一些特定程序。而 springboot Scheduled注解中可以方便的使用 cron 表达式来配置定时任务。在这SpringBoot 实现定时任务一篇文章中我们介绍了如何使用Scheduled实现定时任务,下面我们看下cron该如何编写。

cron表达式格式:
{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
说明:其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?。

cron表达式各占位符解释

字段  允许值 允许的特殊字符 是否允许为空
秒  0-59  , – * /
0-59  , – * /
小时 0-23  , – * /
日期 1-31  , – * ? / L W C
月份 1-12 或者 JAN-DEC  , – * /
星期 1-7 或者 SUN-SAT  , – * ? / L C #
年(可选) 1970-2099 , – * /

特殊字符说明

  • “,” :在指定的秒数触发,比如”0,15,45”代表0秒、15秒和45秒时触发任务
  • “-“:在指定的范围内触发,比如”25-45”代表从25秒开始触发到45秒结束触发,每隔1秒触发1次

  •  “*”代表所有可能的值
  • “/”用来指定数值的增量

例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
 在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样

  •  “?”仅被用于天(月)和天(星期)两个子表达式,表示不指定值

 当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”

  • “L” 仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写如果在“L”前有具体的内容,它就具有其他的含义了。例如:“6L”表示这个月的倒数第6天

注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题

  • W 代表着*日(Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最*的一个*日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。例如,日域中的 15W 意味着 "离该月15号的最*一个*日。" 假如15号是星期六,那么 trigger 会在14号(星期五)触发,因为星期四比星期一离15号更*。
  • C:代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

经典案例:
“15 * * * * ?” 每15分钟触发任务
“30 10 * * * ?” 每小时的10分30秒触发任务
“0 0 0 * * ?” 每天0点0分0秒触发任务
“0 0 0 1 * ?” 每月1号0点0分0秒触发任务
“0 0 0 1 1 ? *” 每年1月1号0点0分0秒触发任务
“0 0 1 8 5 ? 2023” 2023年5月8号1点0分0秒触发任务
“30 10 1 ? 10 * 2011” 2011年10月每天1点10分30秒触发任务
“30 10 1 ? 10 SUN 2011” 2011年10月每周日1点10分30秒触发任务
“15,30,45 * * * * ?” 每15秒,30秒,45秒时触发任务
“15-45 * * * * ?” 15到45秒内,每秒都触发任务
“15/5 * * * * ?” 每分钟的每15秒开始触发,每隔5秒触发一次
“15-30/5 * * * * ?” 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
“0 0/3 * * * ?” 每小时的第0分0秒开始,每三分钟触发一次
“0 15 10 ? * MON-FRI” 星期一到星期五的10点15分0秒触发任务
“0 15 10 L * ?” 每个月最后一天的10点15分0秒触发任务
“0 15 10 LW * ?” 每个月最后一个工作日的10点15分0秒触发任务
“0 15 10 ? * 5L” 每个月最后一个星期四的10点15分0秒触发任务
“0 15 10 ? * 5#3” 每个月第三周的星期四的10点15分0秒触发任务