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整除
浙公网安备 33010602011771号