文章目录
- 1、语法
- 2、取值
- 3、cron表达式生成工具
定时任务相关的需求很多,对应的实现技术与框架也有不少,例如xxl-job、Quartz、Spring Task。不论怎么技术选型,cron表达式通常都是必要的。虽然现在生成cron表达式的小工具网站很多,不用每次都纯手搓,但认识一下,调试代码也方便些。
1、语法
{Seconds} {Minutes} {Hours} {Day of Month} {Month} {Day of Week} {Year}
{Seconds} {Minutes} {Hours} {Day of Month} {Month} {Day of Week}
从左到右依次为:秒 分 时 日 月 星期几 年
,其中年不是必须的。
2、取值
字段 | 含义 | 取值 | 可用的特殊字符 | 是否必须 |
---|---|---|---|---|
Seconds | 秒 | 0-59 | ,- * / | 是 |
Minutes | 分 | 0-59 | ,- * / | 是 |
Hours | 时 | 0-23 | ,- * / | 是 |
Day of Month | 日 | 1-31 | ,- * / ? L W | 是 |
Month | 月 | 1-12或 JAN-DEC | ,- * / | 是 |
Week | 星期几 | 1-7或者SUN-SAT | ,- * / ? L # | 是 |
Year | 年 | 1970-2099 | ,- * / | 否 |
表中,特殊字符的含义:
-
*
: 表示匹配该域的任意值
。在Minutes中使用*,就表示每分钟都会触发,Seconds的值为*就是每秒都触发执行定时任务 -
-
: 表示范围
。在Minutes域中用 10-20,就表示从10分钟到20分钟每分钟都会触发一次 -
,
: 表示列出枚举值
。在Minutes中使用1,3,就表示每到1分钟和3分钟就都会触发一次 -
/
: 表示间隔时间触发(开始时间/时间间隔)
。在Minutes中使用 5/10,就表示从第5分钟开始,每隔10分钟触发一次 -
?
: 表示不指定
值。不指定不等于任意,而是直接根据另一个字段的值触发执行。比如你表达式中指定了每月的5号执行,此时星期那位的值写星期几都不合适,直接问号不指定就行 -
L
:即last,只能用于日和星期,用在日则表示该月的最后一天,用在星期则表示该月的最后一个星期的星期x -
#
: 表示该月第n个星期x(x#n)
,仅用于星期。如:星期:6#3,表示该月的第三个星期五 -
W
:即weekday,只能用于日,表示距离当月给定日期最近的工作日(周一到周五),如10W,即当月距离10号最近的工作日那天触发,此时,如果10号就是工作日,那就这天触发,如果10号是周六,那就9号触发,因为周五和周一比,周五更近,如果10号是周末,那就周一触发,也就是11号 -
LW
: L和W可以一起组合在日字段使用。表示当月的最后一个工作日触发事件
W里,有个
当月
的概念,"1W"表示距离1号最近的工作日触发事件,但是,该工作日只算当月的。假如当月1号是周六,则"1W"表示在当月3号(周一)触发。就算上个月的最后一天是工作日,也不会触发
3、cron表达式生成工具
写需求时不用手搓,生成工具很多,甚至很多框架的页面都集成了生成工具,如xxl-job,按需生成后修修补补就好,生成和反解析都可以,贴几个工具:
- http://cron.ciding.cc/
- https://cron.qqe2.com/
- https://www.matools.com/cron/
- …
搜cron表达式生成器就行,这里只是整理下语法。