20 分钟学会 Quartz Cron 配置 创建于 2019-05-21 12:37:14
Quartz Cron 采用类 Unix Cron 的写法的,但又有些语法拓展。最近使用时,查阅了一些网上资料,但大多是三、四年前的旧文,碰巧在 Quartz Cron 官网看到许多不错的资料,翻译整理为下文。
Cron 表达式由 6 个必填字段和 1个可选字段组成,每个字段之间通过空格分割。
排列顺序为:Seconds Minutes Hours Day-of-month
Month Day-of-Week
Year,其中 Year 为可选。
每个字段详细定义如下表所示:
Field Name | Allowed Values | Allowed Special Characters |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*
:用于圈定范围所有值。例如,在 Minutes 位置使用 *
代表 “每分钟”
?
:只能用于 Day-of-month 和 Day-of-Week 字段,表示‘无指定值’。由于同时指定这两个字段可能会产生规则上的冲突,你可以通过指定某个字段为 ?
来忽略该字段的设置
-
:用于圈定一段范围。例如,在 Hours 设置为 “10-12” 代表“第10、11、12 小时”
,
:用于补充额外值,例如在 Day-of-week
设置为 “MON,WED,FRI”,表示选定“Monday, Wednesday, and Friday”
/
:用于表示递进值,例如 Seconds 设置为 “0/15” 表示选定 “第 0,15,30 和 45 秒”,“5/15” 表示选定 “第 5,20,35 和 50 秒”。在 /
前指定为 *
或 0
两者是等价的。 /
只会在每个字段的合法取值范围内触发事件,递增后的值如果发生越界,不会作取模操作,而是回到起点。例如 Month 设置为 “7/6”,由于 7 + 6 > 11,第1次递增越界,回到起点,该表达式只会在 7 月份触发,等价于 “7”。这里的 6 不是指每 6 个月,需要注意到这细微的差别。
L
:只能用于 Day-of-month 和 Day-of-Week 字段, L
为 “last” 的缩写,在不同字段中有不同的定义。如果Day-of-month 设置为 “L” 指月末,如 1月的第 31 天,平年 2 月的第 28 天等。如果 Day-of-Week 设置为 “L”,代表 “7” 或者 “SAT”。但如果 L
在 Day-of-Week 中出现在其他值之后,表示 “当月的最后一个星期几”,例如 “6L” 表示 “本月的最后一个星期五”。你也可以设置距离月末几天,例如设置 Day-of-month 为 “L-3” 代表距离月末还有三天的时候触发。使用 “L” 参数的时候,避免使用范围取值或者多个枚举值,这会产生不可预期的运行结果。
W
:只可用于 Day-of-month 字段,确定离指定日期最近的工作日(周一至周五)。例如,“15W" 表示 “离 15 号最新的工作日”,如果 15 号是周六,那么 14 号周五将会被选定;如果 15 号是周日,则 16 号周一会被选定;如果 15 号是工作日,那么 15 号自身会被选定。但如果你设置为 “1W”,而且 1 号是星期六,那么当月的 3 号周一会被选定, W
的选定范围被圈定在当月,不会越界。
LW
:混合使用时代表本月最后一个工作日。
#
:只可用于 Day-of-Week 字段。代表“本月第几个 XXX 天”。例如,“6#3” 表示本月的第 3 个星期五(day 6 = 星期五,“#3” 代表本月第3个 XXX 天)。再比如,“4#5” 代表本月第 5 个星期三,但是,如果本月没有第 5 个星期三,那么该条件不会被触发。同一时刻 #
表达式只能出现一次,“3#1,6#3” 是不合法的。
上诉介绍的合法字符大小写不敏感,例如 W 和 w,MON 与 mon 是等价的
?
忽略其中某个字段) 请注意在 day-of-week 和 day-of-month 位置的 '?' 和 '*'
Expression | Meaning |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|