那些什么 ,?之类的Cron表达式

那些什么 * ,?之类的Cron表达式

1.前言

不知道为什么,每次看到这个cron表示式不是 *,?的这些字符头就疼。于是去某度搜索在线生成cron表达式,结果下次还是不知道怎么写。今天花点时间整理下,貌似大概懂了点整理如下。

2.参考

这里我参考了 http://www.bejson.com/othertools/cronvalidate/ 这个网站里面关于表达式的解释

3.cron表达式详解

1. 结构

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:

(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year

(2)Seconds Minutes Hours DayofMonth Month DayofWeek

这几个单词应该不难理解

秒 分 小时 月份中的日期 月份 星期中的日期 年份

其中年是可选类型,也就是说他如果在不设定年分的情况下是每年。所有一般的cron字符串就只有6位字符

2.字段的取值范围以及含义

字段 允许值 允许的特殊字符
秒(Seconds) 0~59的整数 , - * / 四个字符
分(Minutes 0~59的整数 , - * / 四个字符
小时(Hours 0~23的整数 , - * / 四个字符
日期(DayofMonth 1~31的整数(但是你需要考虑你月的天数) ,- * ? / L W C 八个字符
月份(Month 1~12的整数或者 JAN-DEC , - * / 四个字符
星期(DayofWeek 1~7的整数或者 SUN-SAT (1=SUN) , - * ? / L C # 八个字符
年(可选,留空)(Year 1970~2099 , - * / 四个字符

其中

  • 表示匹配该域的任意值,在每个域都可以存在,包含所有合法的值。假如在Minutes域使用, 即表示每分钟都会触发事件。这个相当于通配符,匹配任务值(每天,每月,每小时 等等)

  • ,:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分钟触发一次。

  • ?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。

    说简单点 ?一般出现在第4 和第6 的字符位置,必定存在,有且只有一个,避免日期和星期的冲突

  • -:表示取值范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次

  • /:表示起始时间开始触发,然后每隔固定时间触发一次。相当于一个增量吧

    例如在Minutes域使用5/20,则意味着从第5分钟触开始发一次,每隔20分钟执行一次而。如5,25,45等分别触发一次.

  • L:表示最后,即Last。只能出现在DayofWeek和DayofMonth域。

    如果在DayofWeek域使用5L,意味着在最后的一个星期四触发(星期是从周日开始,且为1)。

    如果早DayofMonth,也就是第4位出现,则意味则这个月的最后一天

  • W:表示有效工作日(周一到周五)weekday,只能出现在DayofMonth域

只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个单独的数值使用,不能够是一个数字段,如:1-15W是错误的

  • LW L和W可以在日期域(DayofMonth)也就是 第4个字符位 中联合使用,LW表示这个月最后一周的工作日,也就是这个月的最后一个星期五

  • **#**只允许在星期域DayofWeek(也就是最后面出现)中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三

  • C” 表示canlendar,即日历,例如“1C”在星期位上就是包括日历上的星期日

    题外话:在实际的使用中,一般不会包含所有以上字符,(而且像字母L,W,# 等这些一般出现在日期和星期,也就是第4和第6 位字符位).所以针对某个字符写几个表达式可以加深对某个字符的含义理解。

4.常见的cron表达式

可以根据下面的表达式更深刻的理解 每个字符在所在位置的含义

(0)0/20 * * * * ? 表示每20秒 调整任务

(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触发

5.总结

根据上面的表达式,可以看出 在前三位字符,也就是 秒 分 时 的取值一般也就是数字(具体值,或者范围值),或者 (匹配所有)。后三位 日 月 星期 中必定有一个*?**字符,剩下的也就是字母类的。

以上个人理解,仅供学习参考。如果侵权联系删除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章