cron表达式的详细介绍(各域说明以及举例说明) 1. 关于 cron 1.1 前言 1.2 使用 cron 的注意点 1.3 举个例子 2. cron表达式的格式(或语法) 3. 各域的含义——如何取值? 3.1 各域的含义介绍 3.2 特殊字符的含义 3.3 简单举例说明及使用效果
1. 关于 cron
1.1 前言
这两天在弄定时任务,感觉 cron 表达式挺有意思,有必要写下来供大家参考学习。 了解过 crontab 的应该都知道 crontab 怎么配置定时任务,其实cron 与 crontab 差不多,但需要注意的是:cron 表达式从左往右,从秒 开始;而 crontab 则是从分钟 开始的。
1.2 使用 cron 的注意点
cron 表达式是一个字符串,包含五个 到七个 由空格分隔 的字段(每种软件不一样,需要注意:Linux 、Java(Spring) 、Java(Quartz) 的区别,本文主要以Java为主,说一下 cron 表达式),表示一组时间,通常作为执行某个程序的时间表。 注释以注释标记#开始,并且必须单独在一行上。
1.3 举个例子
看下面的错误信息: 原因是Spring 的表达式 只是 cron表达式的子集,它不包含year字段,并且不能使用部分特殊字符,比如上面的 #。 举这个两个报错信息是干什么呢?意思是下面关于的特殊字符都会介绍,但是有可能你在使用的时候,因为使用的软件不一样,可能效果没用达到,但是不代表语法有误,你要分场合分情况使用,这点在此特别说明一下!
2. cron表达式的格式(或语法)
比如,cron = "0 30 * * * ? " 代表啥意思呢?往下看,看完你就会明白了! Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
① Seconds Minutes Hours DayofMonth Month DayofWeek ② Seconds Minutes Hours DayofMonth Month DayofWeek Year
秒 分钟 小时 日期 月份 星期 年(年份可留空,通常省略)
3. 各域的含义——如何取值?
3.1 各域的含义介绍
每一个域都使用数字,但还可以出现下面表格里的特殊字符,如下表格:
取值范围 允许的特殊字符 是否必填 备注 秒-Seconds 0~59的整数 , - * / 四个字符 是 标准实现不支持此字段。 分钟-Minutes 0~59的整数 , - * / 四个字符是 小时-Hours 0~23的整数 , - * / 四个字符是 日期 -DayofMonth1~31的整数(但是你需要考虑你月的天数) , - * / ? L W C 八个字符是 ?LW只有部分软件实现了 月份-Month 1~12的整数 或者 JAN-DEC , - * / 四 个字符是 星期 -DayofWeek1~7的整数 或者 SUN-SAT , - * / ? L C # 八个字符是 ? L #只有部分软件实现了, Linux 和 Spring 的允许值为0-7,0和7为周日;Quartz的允许值为1-7,1为周日 年-Year 1970~2099 , - * / 四个字符否 标准实现不支持此字段。
3.2 特殊字符的含义
含义 解释说明 * 表示匹配该域的任意值 如果在 Minutes 域使用 * , 则表示每分钟都会触发事件。 , 表示列出枚举值 如果在Hours 域中使用 9,10 则表示上午9点和10点会出发事件。 - 表示范围 如果在 Seconds 域中使用 5-8 ,则表示 5秒、6秒、7秒、8秒 时间点会触发事件 / 表示起始时间开始触发,然后每隔固定时间触发一次 如果在 Seconds 域中使用 6/10 ,则表示从06秒开始,每10秒执行一次,即:会在 06,16,26,36,56 时间点触发事件,也就是说:在 Seconds 域中配置 6/10 和 配置 06,16,26,36,56 效果一样 ? 只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。(可以理解成是 * 的第二种特殊写法) 例如:15 30 12 9 * ? ,表示的是每月9号 的中午12:30:15发工资,此时 DayofWeek 这个域就要用 ? 而不能用 *(表示每周每天,而我们只要9号一天) L 表示最后Last,只能出现在 DayofWeek 和 DayofMonth 域。 ① 用在DayofMonth 域中(直接写L),可以指定一个月的最后一天;② 用在 DayofWeek 域中指定当月最后一个星期X(比如:2L指本月最后一个星期二) W 表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件 例如:在 DayofMonth 使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。 LW 这两个字符可以连用,表示在某个月最后一个工作日 ,即当月最后一个星期五。 C 代表“Calendar”的意思。但是没发现加C和不加C的区别。 例如:15 30 12 9 * ? ,用9和9C的效果一样。 # 用于确定每个月第几个星期几,只能出现在DayofWeek域。 比如,4#2,表示某月的第二个星期三(4代表星期三,2代表第几个)。例如:15 30 12 ? * 4#2 表示:每月第二个星期三的12:30:15秒执行
3.3 简单举例说明及使用效果
比如:cron = “6/10 * * * * ?”,06秒开始,然后每次间隔10秒 为了方便,接下来我们举例都直接在线验证效果啦! 比如:0 10,30 12 * * ?
或者 0 10,30 12 ? * *
,每天12点的10分和30分执行任务 比如:0 30 14-17 * * ? *
,每天下午14点到17点中的半点执行 好了,就简单举几个就行了,比葫芦画瓢的东西,自己看着画吧 推荐几个自动生成以及验证cron的网址: https://www.matools.com/cron. http://cron.ciding.cc/. https://cron.qqe2.com/. https://www.bejson.com/othertools/cron/. 上述网站,喜欢就用,不喜欢别吐槽,自己厉害也不用他们,自己再厉害也可以做个给我们大家!