UNIX cron
格式
Minute Hour DayofMonth Month DayofWeek
分钟 小时 自然月中的天 月 星期中的天
它的最小单位是分钟,所以正常来说是没办法执行秒级的任务不支持年!
unix服务器上使用的cron表达式就是这个。
ScheduledExecutorService cron(jdk自带)
格式
Second Minute Hour DayofMonth Month DayofWeek
秒 分钟 时 自然月的天 月 星期中的天
其中月和星期几可以使用英文的前3个字母不支持年!
规则
字段允许值允许的特殊字符秒(Seconds)0~59的整数, - * / 4个字符分(Minutes)0~59的整数, - * / 4个字符小时(Hours)0~23的整数, - * / 4个字符日期(DayofMonth)1~31的整数(注意月的天数), - * / ? L 5个字符月份(Month)1~12的整数或者 JAN-DEC, - * / 4个字符星期(DayofWeek)0~7的整数或者 SUN-SAT (1=Mon), - * / ? L W 7个字符
说明
*:代表任何数字
,:逗号代表多个数字的间隔符
-:代表从几到几
/:代表每隔多长时间触发一次
?:代表只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于占位符;
L:代表Last
的意思,只在日期和星期字段中使用,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7
W:代表表示离该日期最近的工作日。比如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。
示例
0/1 * * * * ? 每秒钟执行一次。这里面的/就代表从0秒开始,每一秒执行一次。
0/50 * * * * ? 从0秒开始每50秒执行一次,那么它的执行时间就是0秒一次,50秒一次,紧接着下一秒的0秒一次,50秒一次,这样他们之间的间隔并不完全是50秒,这里指的是秒0到59的周期内,从0开始每50秒一次
0 0/5 * * * ? 每5分钟执行一次。秒是0,然后分钟是从0开始每5分一次,也就是0分0秒一次,5分0秒1次依次类推
5 0/5 * * * ? 0分5秒一次,5分5秒1次依次类推
0/2 * * * ? 0分内每秒一次执行60次,2分的时候每秒一次执行60次,依次类推
Scheduled cron(spring的context包中带的cron)
格式
Seconds Minutes Hours DayofMonth Month DayofWeek
秒 分钟 时 自然月的天 月 星期中的天
其中月和星期几可以使用英文的前3个字母不支持年!
注意:网上很多文章会拿Quartz的cron表达式来解释Scheduled cron,它俩是有区别的!!!
规则
字段允许值允许的特殊字符秒(Seconds)0~59的整数, - * / 4个字符分(Minutes)0~59的整数, - * / 4个字符小时(Hours)0~23的整数, - * / 4个字符日期(DayofMonth)1~31的整数(注意月的天数), - * / ? 5个字符月份(Month)1~12的整数或者 JAN-DEC, - * / 4个字符星期(DayofWeek)0~7的整数或者 SUN-SAT (0=7=Sun), - * / ? 5个字符
示例
0 0 * * * * 每天0点0分执行
*/10 * * * * * 每10秒执行一次
0 0 8-10 * * * 每天的8点、9点、10点执行
0 0 6,19 * * * 每天6点、17点执行
0 0/30 8-10 * * * 每天的8:00, 8:30, 9:00, 9:30, 10:00 and 10:30执行
0 0 9-17 * * MON-FRI 每周工作日的9到17点整点执行
0 0 0 25 12 ? 每年的12月25号0点执行
0 10,44 14 ? 3 WEB 在三月中的每个星期三的下午 2:10 和 下午 2:44 被触发。
? 号只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为 ? 字符是 "我并不关心在该域上是什么值。" 这不同于星号,星号是指示着该域上的每一个值。? 是说不为该域指定值。
不能同时这两个域上指定值的理由是难以解释甚至是难以理解的。基本上,假定同时指定值的话,意义就会变得含混不清了:考虑一下,如果一个表达式在日域上有值11,同时在周域上指定了 WED。那么是要 trigger 仅在每个月的11号,且正好又是星期三那天被激发?还是在每个星期三的11号被激发呢?要去除这种不明确性的办法就是不能同时在这两个域上指定值。
只要记住,假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?。
Quartz cron
格式
Seconds Minutes Hours DayofMonth Month DayofWeek [Year]
秒 分钟 时 自然月的天 月 星期中的天 年[可以为空]
其中月和星期几可以使用英文的前3个字母,星期可以写全名
注意:网上很多文章会拿Quartz的cron表达式来解释Scheduled cron,它俩是有区别的!!!
规则
字段允许值允许的特殊字符秒(Seconds)0~59的整数, - * / 4个字符分(Minutes)0~59的整数, - * / 4个字符小时(Hours)0~23的整数, - * / 4个字符日期(DayofMonth)1~31的整数(注意月的天数), - * / ? L C W 8个字符月份(Month)1~12的整数或者 JAN-DEC, - * / 4个字符星期(DayofWeek)1~7的整数或者 SUN-SAT (1=SUN), - * / ? L C # 8个字符年(可选)(Year)1970~2099, - * / 4个字符
特别注意:quartz星期的第一个为星期天,数值为1,星期一对应数值2
说明
特殊字符说明,逗号代表多个数字的间隔符*代表任何数字-代表从几到几/代表每隔多长时间触发一次?只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为 ? 字符是 "我并不关心在该域上是什么值。" 这不同于星号,星号是指示着该域上的每一个值。? 是说不为该域指定值。不能同时这两个域上指定值的理由是难以解释甚至是难以理解的。基本上,假定同时指定值的话,意义就会变得含混不清了:考虑一下,如果一个表达式在日域上有值11,同时在周域上指定了 WED。那么是要 trigger 仅在每个月的11号,且正好又是星期三那天被激发?还是在每个星期三的11号被激发呢?要去除这种不明确性的办法就是不能同时在这两个域上指定值。只要记住,假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?。L是last的省略写法可以表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表示一个月的最后一天。如果在day-of-week域表示星期六,值为‘7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如‘6L’就表示一个月的最后一个星期五。L 说明了某域上允许的最后一个值。它仅被日和周域支持。当用在日域上,表示的是在月域上指定的月份的最后一天。例如,当月域上指定了 JAN 时,在日域上的 L 会促使 trigger 在1月31号被触发。假如月域上是 SEP,那么 L 会预示着在9月30号触发。换句话说,就是不管指定了哪个月,都是在相应月份的时最后一天触发 trigger。不要让范围和列表值与 L 连用,虽然你能用星期数(1-7)与 L 连用,但是不允许你用一个范围值和列表值与 L 连用。这会产生不可预知的结果W只允许日期域出现。这个字符用于指定日期的最近(注意不是之后有可能是之前)工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个单独的数值使用,不能够是一个数字段,如:1-15W是错误的。“L”和“W”可以在日期域中联合使用,LW表示这个月最后一周的工作日。#只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三。C允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历”关联,则等价于所有包含的“日历”。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)。