该文章介绍cron表达式语法规则,实际工作中百度搜 “ Cron表达式生成器 ” 来编写cron表达式是效率最高的方式,但是语法规则还是需要了解一下的,因为如果不懂语法的话,那些在线编辑器的某些BUG会导致你无法编写出来符合需求的cron表达式。
例子:0 0 12 ? * WED *
如上,cron表达式由七部分组成,中间由空格分隔,这七部分从左往右依次是:
英文字段名 | 中文字段名 | 合法值 | 允许的特殊字符 |
---|---|---|---|
Seconds | 秒 | 0 - 59 | , - * / |
Minutes | 分钟 | 0 - 59 | , - * / |
Hours | 小时 | 0 - 23 | , - * / |
Day-of-Month | 日期 | 1 - 月最后一天 | , - * / ? L W |
Month | 月份 | 1 - 12 或 JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC | , - * / |
Day-of-Week | 星期几 | 1 - 7(1表示星期日,即从星期日开始) 或 SUN, MON, TUE, WED, THU, FRI, SAT | , - * / ? L # |
Year (optional field) | 年(可选项) | 1970-2099,一般该项不设置,直接忽略掉,即可为空值 | , - * / |
还说这个例子:
0 0 12 ? * WED *
这个例子的意思是 “ 每个星期三的中午12点 ” 。
特殊字符解释(特殊字符都指的是英文字符):
,
用来定义列表,例如:
1,3,5 * * * * ?
表示 “ 每年每月每天每时每分的每个第1秒,第3秒,第5秒 ” 。
-
用来定义范围,例如:
1-5 * * * * ?
表示 “ 每年每月每天每时每分的第1秒至第5秒 ”。
以上两个特殊符号也可以组合起来用,例如:
1-5,10,15 * * * * ?
表示 “ 每年每月每天每时每分的第1秒至第5秒,第10秒,第15秒 ” 。
*
用来表示当前字段的每一个合法值,因此若 “ 秒 ” 字段写 “ * ” 号表示每秒,若 “ 分 ” 字段写 “ * ” 则表示每分,例如:
* * * * * ?
表示 “ 每年每月每天每时每分每秒 ” 。
/
表示阶段增加,例如
0/15 * * * * ?
表示 “ 每年每月每天每时每分,每15秒一次,从第0秒开始 ” 。即 “ / ” 的左侧是开始值,右侧是间隔。(如果是从 “ 0 ” 开始的话,也可以简写成 “ /15 ” ,没有验证过,不知道是否正确。)
?
只用在Day-of-Month字段和Day-of-Week字段中,这两个字段是互斥的,即如果其中一个字段设置了值,则另一个必须设置为 “ ? ”,例如:
* * * 3 * ?
和
* * * ? * 3
上面两个cron表达式是对的,即那俩字段同时只能有一个设置值。
* * * 3 * 3
和
* * * ? * ?
上面两个则都是错的,这两个字段不能同时设置值,也不能同时都不设置值。
W
只用在Day-of-Month字段中,表示最接近某一天的工作日(weekday),W不会跨月,例如:
* * * 15W * ?
表示最接近15号的工作日,工作日表示星期一到星期五,如果15号是星期六,则表示14号,即星期五,如果15号是星期天,则表示16号,即星期一。如果15号是星期三,则表示15号本身,即星期三。
* * * 31W * ?
若31号是星期六,则表示30号,若31号是星期天,则也表示30号,而不会是下月1号。
#
只用在Day-of-Week字段中,表示第几个星期几,例如:
* * * ? * 6#3
表示每个月的第三个星期五。
L
last**的意思,只用在Day-of-Month字段和Day-of-Week字段中,在这俩字段中意义不同。
1、若在Day-of-Month中,表示每个月的最后一天,例如:在一月份中表示31号,在六月份中表示30号,在闰年二月份中表示29号,平年二月份表示28号。也可以使用偏移量的写法,例如:L-3表示每个月的倒数第3天。举例如下:
* * * L * ?
表示每月最后一天
* * * L-3 * ?
表示每月倒数第3天
* * * LW * ?
LW可以连起来用,表示每月最后一个工作日,即每月最后一个星期五
2、若在Day-of-Week中,仅表示7或者SAT,但是,若前面有其他值的话,则表示最后一个星期几,例如:
* * * ? * L
表示每个星期六
* * * ? * 6L
或者
* * * ? * FRIL
表示同一个意思,即每月的最后一个星期五
注意:在使用L的时候禁止再在当前字段使用 “ , - / ” 来声明时间列表或者时间段,这可能导致无法预料的结果。例如下面几个cron表达式写法应该禁止使用
* * * 1-5,L * ?
或
* * * ? * 1-3,5L
摘录一些其他文章的cron表达式例子
(1) 0 0 2 1 * ? * 表示在每月的1日的凌晨2点调整任务
(2) 0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
(3) 0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4) 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
(5) 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
(6) 0 0 12 ? * WED 表示每个星期三中午12点
(7) 0 0 12 * * ? 每天中午12点触发
(8) 0 15 10 ? * * 每天上午10:15触发
(9) 0 15 10 * * ? 每天上午10:15触发
(10) 0 15 10 * * ? * 每天上午10:15触发
(11) 0 15 10 * * ? 2005 2005年的每天上午10:15触发
(12) 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
(13) 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
(14) 0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(15) 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
(16) 0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
(17) 0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
(18) 0 15 10 15 * ? 每月15日上午10:15触发
(19) 0 15 10 L * ? 每月最后一日的上午10:15触发
(20) 0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
(21) 0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
(22) 0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
原文出处:https://blog.csdn.net/lianjunzongsiling/article/details/82228655
共同学习,写下你的评论
评论加载中...
作者其他优质文章