Cron表达式

因为之前用到了这个,老大让我分享一波,然后根据网上找到的资料自己整理了一份,文档如下

一.什么是Cron表达式?

Cron表达式 用于设置周期性被执行的指令,运行定时任务

 

二.Cron表达式组成及解析

       Cron表达式是一个字符串,分为7个域,以空格间隔开

* * * * * ? *

分别代表秒,分,时,天,月,周,年(年一般可省略),所以一般都写6位即可,

取值范围为

第一位 秒,取值0-59

第二位 分,取值0-59

第三位 时,取值0-23

第四位 天,取值1-31,需考虑月

第五位 月,取值1-12

第六位 周,取值1-7或 SUN-SAT(需大写)

第七位 年,取值1970-2099(一般该位省略)

 

除了以上常规取值,还有一些常用特殊字符

       * 匹配该域的所有值

? 只用在天和周两个域,表示不指定值,不确定

- 匹配一个范围,例如在小时范围 10-12,就代表10点 11点 12点

表示列表值,枚举 例如星期位置 1,2,4 就代表周天,周一,周三

/  如 a/b,a为起始值,b为增量值 在分钟位 1/20就代表从1分钟开始,每隔20分钟,即1,21,41

L 仅用在天和周两个域,Last的缩写,代表该域的最后一个单位,某月的最后一天或某星期的最后一天

W 表示有效工作日(周一到周五),只用在天域,若触发的天为非工作日,匹配最近工作日,不跨月。 例如 天域为5W,5号若为周六,则匹到4号,若为周天,则匹6号

LW 表示某月的最后一个工作日,也仅出现在天域

#  作用于周域,如 x#y  x代表星期,y代表本月第几周,例如5#3就代表某月第三周的星期四

 

在cron表达式中*和?的区别

1.     可出现位置不同,?只出现天,周,*任意

2.     *表示的取该域所有值,每秒,每分,每时

?表示不用关心该域的值,有时两个域的取值矛盾,即需要?,常见为天和星期

例 每月第一天的上午9点,cron表达式为 0 0 9 1 * ?

 

三.实际应用

       1.Jst.Framework中已经封装好方法,可通过传cron字符串获取下次运行时间,或者最近多次运行时间

       2.校验cron格式时,建议不要写正则表达式,可以从NuGet引用Quartz组件,用以下方式校验cron表达式格式

if (CronExpression.IsValidExpression(cronStr))

 

四.Cron表达式示例

       1. 每天上午10点运行  

0 10 * * ?

2      每周一至周五,早9晚6各运行一次  

0 0 9,18 * * 2-6

3.     每月最后一天上午10点半运行

0 30 10 L * ?

4.     每月最后一周的周五 下午三点

0 0 15 ? * 5L

5.     每月周一到周五上午10点到12点每隔半小时运行一次

0 0/30 10-12 ? * 2-6

6.     每年7月7日 10点和12点每隔20分钟运行一次

0 0/20 10,12 7 7 ?

五. 错误Cron表达式示例

       1.  * * * * * *

       2.  0 20 * 1 * *

       3.  0 0 10 ? 7 8

  错误表达式常见问题,就是星期和天域的值冲突

六.每隔50分钟运行一次可以写吗?

  答案是不能写,0 0/50 * * * ? 的时间是 0:00 0:50 1:00 1:50,显然,间隔时间为50分,10分,0 */50 * * * ?也是一样的,所以想要任意间隔某分钟运行,必须为60整除

posted on 2019-10-25 15:16  路边小石头  阅读(2754)  评论(0)    收藏  举报

导航