为了账号安全,请及时绑定邮箱和手机立即绑定

Cron表达式语法详解

标签:
Java

该文章介绍cron表达式语法规则,实际工作中百度搜 “ Cron表达式生成器 ” 来编写cron表达式是效率最高的方式,但是语法规则还是需要了解一下的,因为如果不懂语法的话,那些在线编辑器的某些BUG会导致你无法编写出来符合需求的cron表达式。


例子:0 0 12 ? * WED *
如上,cron表达式由七部分组成,中间由空格分隔,这七部分从左往右依次是:

英文字段名中文字段名合法值允许的特殊字符
Seconds0 - 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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消