相关文章推荐
很酷的手套  ·  【vba字典】- 虎课网·  11 月前    · 
微笑的手套  ·  Spring Boot Reference ...·  1 年前    · 
稳重的葫芦  ·  php - Gitlab: ...·  1 年前    · 
玩命的苦瓜  ·  IEEE ...·  1 年前    · 

quartz 时间表达式之Cron表达式详解

Cron表达式:就是用简单的xxoo符号按照一定的规则,就能把各种时间维度表达的淋漓尽致,无所不在其中,然后在用来做任务调度(定时服务)的quart.net
中所认知执行,可想而知这是多么的天衣无缝,说是编码艺术凝集一点不过分

Cron表达式的符号、格式表格
表1、cron表达式特殊字符意义示意表

特殊字符 意义
* 匹配所有的值。如:*在分钟的字段域里表示 每分钟
? 只在日期域和星期域中使用。它被用来指定“非明确的值”
- 指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”
, 指定几个可选值。如:“MON,WED,FRI”在星期域里表示“星期一、星期三、星期五”
/ 指定增量。如:“0/15”在秒域意思是没分钟的0,15,30和45秒。“5/15”在分钟域表示没小时的5,20,35和50。符号“”在“/”前面(如:/10)等价于0在“/”前面(如:0/10)
L 表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表示一个月的最后一天。如果在day-of-week域表示‘7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如‘6L’就表示一个月的最后一个星期五
W 只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个单独的数值使用,不能够是一个数字段,如:1-15W是错误的
LW L和W可以在日期域中联合使用,LW表示这个月最后一周的工作日
| 只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三
C | 允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历”关联,则等价于所有包含的“日历”。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)

表2、 Cron 表达式特殊字符意义对应表

header 1 header 2 header 2
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日 1-31 , - * / L W C
月 1-12 , - * /
星期 1-7 , - * ? / L C #
年(可选) 1970-2099 , - * /
实例
接下来的cron表达式,我会结合着quartz来描述。首先cron表达式是有7个域的,依次分别是:秒分时日月周年,其中年是可选类型,也就是说他如果在不设定年分的情况下是每年。

1、星号(*)
在每个域都可以存在,包含所有合法的值,看好这里是包含所有,意思就是说在那一个域上表示这个域上的所有值,加入在月,表示1-12,也就是说是每月,都会被执行。

示例1:0**1*?   note:每月1号凌晨都会被执行。
示例2:0**?**   note:每分钟的00秒被执行。

2、问号(?)
在cron表达式中,必定存在,有且只有一个,且他只能在日和周的域中存在,表示,不关系这个域是什么值,看好了,跟*的包含所有值不同,他是不关系是月的哪一天或是周的哪一天。如果在周域定义具体的数值,日域必须为问号(?),如果在日域定义啦具体的数值,那么周域就必须为问号(?)。为什么,因为避免含糊不清的表达方式,比如3月的第20天,刚好是第三周的第5天,那么如果在日域定义20,周域定义5这样,就双重定义,很蛋疼。cron表达式也不允许。

示例1:0 10 18 ? 3 WEB     note:每年3月的每个星期三,下午6点10分都会被触发
示例2:0 10 18 15 3 ?        note:每年三月的第15天,下午6点10分都会被触发

3、横杠(-)
他在cron表达式中,可以存在任何域,如果存在某个域,表示起止时间,他表示一个时间段。

实例1:0 10 18 1-5 * ?          note:每月的1号到5号(包含每月1号和5号,每月共计5天都会被触发),下午6点10分都会被触发
实例2:0 10-15 * ? * *          note:每小时的第10分钟到第15分钟(包含每小时的第10分钟和第15分钟,每小时共计5分钟都会被触发),都会被触发

4、逗号(,)
他在cron表达式中,可以存在任何域,如果存在某个域,表示可选值,他是个多点的概念。

实例1:10,20  *  * ? * *         note:每分钟的第10秒与第20秒都会被触发
实例2:0 10,20 * 1,2 * ?          note:每月的第1天与第2天的,每小时的第10分钟与第20分钟被触发。

5、斜划线(/)
他在cron表达式中,可以存在任何域,表示增量,是在域中设定一个起始的值,然后每隔多少时间的概念。

实例1:5/20 * * ? * *           note:每分钟的第5秒,第25秒,第45秒 都会被执行。
实例2:0 * 2/2 ? *  *          note:每天的第2小时,第4小时,第6小时,第8小时 ... 第22小时的00分00秒都会被触发。

6、井号(#)
他在cron表达式中,只能存在周这一个域,表示第几周的星期几,如果超出范围,则忽略不记。

实例1:* * * ? * 3#4            note:每月的第4个星期的周2,凌晨触发。
实例2:* * * ? * 6#2            note:每月的第2个星期的周5,凌晨触发

●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;

●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;

●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;

●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;

● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

@Scheduled(cron = "0 0 1 1 1 ?")//每年一月的一号的1:00:00 执行一次
@Scheduled(cron = "0 0 1  1 1,6 ?") //一月和六月的一号的1:00:00 执行一次
@Scheduled(cron = "0 0 1  1 1,4,7,10 ?") //每个季度的第一个月的一号的1:00:00 执行一次
@Scheduled(cron = "0 0 1  1 * ?")//每月一号 1:00:00 执行一次
@Scheduled(cron = "0 0 1 ? * MON")  //每周周一 1:00:00 执行一次
@Scheduled(cron="0 0 1 * * *") //每天凌晨1点执行一次
"0 0 0/2 * * ?" 每隔2个小时触发
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

Cron表达式示例:

表达式 说明

"0 0 12 * * ? " 每天12点运行
"0 15 10 * * ?" 每天10:15运行
"0 15 10 * * ? 2011"    2011年的每天10:15运行
"0 * 14 * * ?"  每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。
"0 0/5 14 * * ?"    每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。
"0 0/5 14,18 * * ?" 每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。
"0 0-5 14 * * ?"    每天14:00点到14:05,每分钟运行一次。
"0 10,44 14 ? 3 WED"    3月每周三的14:10分到14:44,每分钟运行一次。
"0 15 10 ? * MON-FRI"   每周一,二,三,四,五的10:15分运行。
"0 15 10 15 * ?"    每月15日10:15分运行。
"0 15 10 L * ?" 每月最后一天10:15分运行。
"0 15 10 ? * 6L"    每月最后一个星期五10:15分运行。
"0 15 10 ? * 6L 2007-2009"  在2007,2008,2009年每个月的最后一个星期五的10:15分运行。
"0 15 10 ? * 6#3"   每月第三个星期五的10:15分运行。

每隔5秒执行一次:*/5 * * * * ?

每隔1分钟执行一次:0 */1 * * * ?

每天23点执行一次:0 0 23 * * ?

每天凌晨1点执行一次:0 0 1 * * ?

每月1号凌晨1点执行一次:0 0 1 1 * ?

每月最后一天23点执行一次:0 0 23 L * ?

每周星期天凌晨1点实行一次:0 0 1 ? * L

在26分、29分、33分执行一次:0 26,29,33 * * * ?

每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点 
"0 0 12 * * ?" 每天中午12点触发 
"0 15 10 ? * *" 每天上午10:15触发 
"0 15 10 * * ?" 每天上午10:15触发 
"0 15 10 * * ? *" 每天上午10:15触发 
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 
"0 15 10 15 * ?" 每月15日上午10:15触发 
"0 15 10 L * ?" 每月最后一日的上午10:15触发 
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 
                    quartz 时间表达式之Cron表达式详解简单介绍Cron表达式:就是用简单的xxoo符号按照一定的规则,就能把各种时间维度表达的淋漓尽致,无所不在其中,然后在用来做任务调度(定时服务)的quart.net中所认知执行,可想而知这是多么的天衣无缝,说是编码艺术凝集一点不过分Cron表达式的符号、格式表格表1、cron表达式特殊字符意义示意表特殊字符	意义*	匹配所有的值。如:*在分...
				
关于@Scheduled(cron = “0 */1 * * * ?”)运行一段时间不生效 项目场景:客户端时间校准,每隔 1分钟 同步一次服务器时间时间不同则进行修订客户端时间。 问题描述: 部分客户端出现时间不同步。 @Scheduled(cron = "0 */1 * * * ?") public void calibrationRun() { service.execute(() -> { log.info("开始同步时间!");
springboot 我们一般都用 @Scheduled作为定时任务 @Scheduled默认为单线程模式 ,如果同时有多个定时任务同时运行,是按同步运行的,所以如果有某个定时任务进入死循环或者用时比较长 就会影响其他的定时任务执行 解决: 设置@Scheduled多线程 添加下面类 package com.midea.mcc.task; import org.springframew...
(1)0/2 * * * * ? 表示每2秒 执行任务 (2)0 0/2 * * * ? 表示每2分钟 执行任务 (3)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务 (4...
****前言**** 无论是做开发还是做运维的程序猿,crontab命令是必须用到的命令,特别是对于运维的人,自动化运维中,crontab也属于其一。然而就来记录常用的crontab定时处理命令。 ****crontab简介**** 简而言之呢,crontab就是一个自定义定时器。 ****crontab配置文件**** 其一:/var/spool/cron/ 该目录下存放的是每个用户(包...
基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。 @Component @Configuration //1.主要用于标记配置类,兼备Component的效果。 @EnableScheduling // 2.开启定时任务 public class SaticScheduleTask { //3.添加定时任务 @Scheduled(...
Cron详解 Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 1.Seconds Minutes Hours DayofMonth Month DayofWeek Year 2.Seconds Minutes Hours DayofMonth Month DayofWeek 每一个域可出现的字符如下: Seconds: 可出现", - * /"四个字符,有效范围为0-59的整数 Minutes: 可出现", - * /"四个字符,
要使用@Scheduled注解,首先需要在启动类添加@EnableScheduling,启用Spring的计划任务执行功能,这样可以在容器中的任何Spring管理的bean上检测@Scheduled注解,执行计划任务。 * An annotation that marks a method to be scheduled. Exactly one of * the {@link #cron()}, {@link #fixedDelay()}, or {@link ...
  Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:   (1)Seconds Minutes Hours DayofMonth Month DayofWeek Year   (2)Seconds Minutes Hours DayofMonth Month DayofWeek   corn从左...
Quartz是一款Java开源的Job调度框架,通过Quartz可以实现对任务的定时调度、执行等功能。而Quartz cron表达式则是用来指定Quartz Job定时调度规则的一种语法格式。 Quartz cron表达式由6或7个字段组成,以空格分隔,分别表示: 1. 秒(0-59) 2. 分钟(0-59) 3. 小时(0-23) 4. 日(1-31) 5. 月(1-12) 6. 星期(1-7,1表示星期日) 7. 年(可选,1970-2099) 其中,每个字段都可以是一个具体的值、一个逗号分隔的多个值、一个范围值(用“-”连接)、一个递增值(用“/”连接)、一个通配符(用“*”表示所有可能的值)、一个或多个问号(“?”表示不确定的值,用于替代某些字段),或者一个L值(表示最后一个值)。 例如,以下是一些Quartz cron表达式的示例: - 每天的10点15分执行:0 15 10 * * ? - 每天的15点整执行:0 0 15 * * ? - 每天的18点、20点和22点执行:0 0 18,20,22 * * ? - 每周一的10点15分执行:0 15 10 ? * 2 - 每月的第三个星期五的10点15分执行:0 15 10 ? * 6#3 需要注意的是,Quartz cron表达式中的时间都是基于服务器所在时区的。此外,Quartz cron表达式只能精确到分钟级别,无法精确到秒或毫秒级别。