Cron表达式语法详解


该文章介绍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触发


原创不易,转帖请注明出处 — shizhongqi


  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cron表达式是一种用于指定定时任务执行时间的字符串表达式。它由6个字段组成,分别表示秒、分、小时、天、月、周,每个字段都有一些特定的取值范围和取值规则。 以下是Cron表达式的格式: ``` <秒> <分> <小时> <日> <月> <周> <年> ``` 其中,年是可选的,其它字段都是必须的。以下是各个字段的取值范围和取值规则: - 秒 (0-59) - 分 (0-59) - 小时 (0-23) - 日 (1-31) - 月 (1-12) - 周 (0-7,0和7都表示周日) 在Cron表达式中,每个字段都可以是一个具体的数字,也可以是一个范围、一个列表或者一个通配符。以下是一些例子: - *:表示所有可能的值,比如“*”在分钟字段中表示每分钟都执行。 - ?:表示未指定,比如在日字段中表示不关心是几号。 - -:表示范围,比如在小时字段中表示10点到12点。 - /:表示间隔,比如在秒字段中表示每隔5秒执行一次。 - ,:表示列表,比如在周字段中表示周一和周二。 验证Cron表达式的方法有很多种,下面是一种Java实现的示例: ```java import org.quartz.CronExpression; public class CronUtils { public static boolean isValid(String cronExpression) { try { new CronExpression(cronExpression); return true; } catch (Exception e) { return false; } } } ``` 这个示例使用了Quartz框架提供的CronExpression类来解析和验证Cron表达式。如果传入的表达式格式不正确,会抛出异常并返回false,否则返回true。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值