Cron表达式是一种字符串,表示定时任务的执行周期和频率,Cron处理程序会根据这个表达式计算出下一次任务应该执行的时间点,在任务执行之后,Cron服务会再次计算下一次任务应该执行的时间点。这个过程会一直重复
这玩意跟正则表达式一样,本人学了无数次,但每次都会忘,用到的时候又再去临时学习
Cron格式
Cron表达式包含了6个或7个字段,每个字段代表不同的时间类型,字段间以空格分割
7个字段的Cron是完整格式
Seconds Minutes Hours DayofMonth Month DayofWeek Year
Year字段可以被省略,于是就有了6个字段的Cron
Seconds Minutes Hours DayofMonth Month DayofWeek
含义如下:
- Seconds:秒,可出现
, - * /四个字符,有效范围为0-59的整数 - Minutes:分钟,可出现
, - * /四个字符,有效范围为0-59的整数 - Hours:小时,可出现
, - * /四个字符,有效范围为0-23的整数 - DayofMonth:每月的日期,可出现
, - * / ? L W C八个字符,有效范围为0-31的整数 - Month:月份,可出现
, - * /四个字符,有效范围为1-12的整数或JAN-DEc - DayofWeek:每周的星期,可出现
, - * / ? L C #八个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推 - Year:年份,可出现
, - * /四个字符,有效范围为1970-2099年
注意:DayofMonth和DayofWeek会相互影响
Cron字段
每个字段都使用数字表示精确的时间节点,也可以出现特殊字符,表示频率、时间范围或者通配符
-
10:一个精确的数字,假如在Minutes使用10,表示在第10分钟触发任务,其他数字同理
-
*:表示匹配该字段的任意值,假如在Minutes使用*,则表示每分钟都会触发任务 -
?:代表不指定值。这个符号只能用在日期和星期字段中,表示"我不关心这个字段的值"比如想在每个月的1号触发任务,而不关心这个1号是星期几,则可以有如下写法:
3 13 15 1 * ? -
-:表示时间范围,例如在Minutes使用5-20,表示在第5到第20分钟期间,每分钟触发一次任务 -
,:表示枚举值,例如在Minutes使用5,20,表示在第5分钟和第20分钟各触发一次,共触发两次 -
/:表示执行频率,例如在Minutes使用5/20,表示在第5分钟执行一次,后面每20分钟各执行一次,即在第5、25、45执行一次,共3次 -
L:表示最后,用于日期和星期,用在日期时表示一个月的最后一天;用在星期时表示一个月的最后一周,此时需要与数字搭配,比如1L表示一个月的最后一个周日 -
W:表示最近的工作日(周一到周五),只能用于日期字段,例如,15W表示"最接近每月15日的工作日"L与W可以搭配使用,比如LW表示每月的最后一个工作日 -
#:表示第几个周几,仅在星期字段中使用,例如,2#3表示每个月的第三个周一(2表示周一,3表示第三个)
*和?的区别:
语义不同。?用于避免与其他字段的冲突,确保调度的唯一性和清晰性
我们知道DayofMonth和DayofWeek这两字段可能会发生冲突,当其中一个字段指定了值后,另一个一般都要使用?来避免冲突
Cron示例
下面演示几个常用的Cron表达式
-
每天中午12:00:00执行
0 0 12 * * ? -
每个月的最后一个星期五上午10:15:10执行
10 15 10 ? * 6L -
每天下午14:00:00到14:55:00期间,每隔5分钟执行一次
0 0/5 14 * * ? -
每个月的第1天和接下来的每5天中午12:00:00执行(即,1日、6日、11日等
0 0 12 1/5 * ? -
每年1月、2月和3月的每天中午12:00:00执行
0 0 12 * JAN,FEB,MAR ? -
2024年的每个月的第一个星期一中午12:00:00执行
0 0 12 ? * 2#1 2024 -
朝九晚五工作时间内每半小时执行一次
0 0/30 9-17 * * ? -
每月的最后一个星期五上午10:15:30执行
30 15 10 ? * 6L