简介

定时任务,就是能够在规定时间内重复执行的任务。而定义定时任务的表达式就是Cron表达式。

Corn表达式就是一个字符串,它以5或6个空格隔开,包含6或7个域,每一个域代表一个含义,Cron表达式有两种语法格式:

(1)秒 分 时 日 月 周 年

(2)秒 分 时 日 月 周

第二种语法格式少了一个,代表每一年,尽量使用第一种,第二年钟可能会出现奇怪的bug

各字段的符号范围以及允许字符:

字段允许值允许字符
0-59, - * /
0-59, - * /
0-23, - * /
1-31, - * ? / L W C
1-12 或 JAN-DEC, - * /
1-7 或 SUN-SAT, - * ? / L C #
留空 或 1970-2099, - * /

详解

Cron在线表达式生成器:http://cron.ciding.cc/

允许值范围: 0~59,不允许为空值

*:每隔1秒钟触发。例子:* * * * * *代表每秒钟执行1

,:指定的秒数触发。例子:0,30,45 * * * * * 代表每分钟的第0,30,45秒执行

-:指定的范围内触发。例子:10-30 * * * * *代表每分钟从第10秒开始到第30秒结束,每隔1秒执行1次

/:触发步进,/前面的值代表初始值(没有则为0),后面的值代表偏移量。例子:

  • 5/10 * * * * ?代表从第5秒开始,每隔10秒执行1次
  • /20 * * * * ?代表从第0秒开始,每隔20秒执行1次
  • 10-40/10 * * * * *代表从第10秒开始,第40秒结束,每隔10秒执行1

允许值范围: 0~59,不允许为空值

*:每隔1分钟触发。例子:0 * * * * *代表每分钟执行1

,:指定的分钟触发。例子:0 0,30,45 * * * * 代表第0,30,45分钟执行

-:指定的范围内触发。例子:0 10-30 * * * *代表从第10分钟开始到第30分钟结束,每隔1分钟执行1次

/:触发步进,/前面的值代表初始值(没有则为0),后面的值代表偏移量。例子:

  • 0 5/10 * * * *代表从第5分钟开始,每隔10分钟执行1次
  • 0 /20 * * * ?代表从第0分钟开始,每隔20分钟执行1次
  • 0 10-40/10 * * * *代表从第10分钟开始,第40分钟结束,每隔10分钟执行1

允许值范围: 0~23,不允许为空值

*:每隔1小时触发。例子:0 0 * * * *代表每小时执行1

,:指定的时间点触发。例子:0 0 0,2,9 * * * 代表第0,2,9小时执行

-:指定的范围内触发。例子:0 0 10-20 * * *代表从第10点开始到第20点结束,每隔1小时执行1次

/:触发步进,/前面的值代表初始值(没有则为0),后面的值代表偏移量。例子:

  • 0 0 5/10 * * *代表从第5点开始,每隔10小时执行1次
  • 0 0 /20 * * ?代表从第0点开始,每隔20小时执行1次
  • 0 0 10-20/10 * * *代表从第10点开始,第20点结束,每隔10小时执行1

允许值范围: 1-31 ,不允许为空值

W字符代表着平日(Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。例子:

  • 15W:离该月15号的最近一个平日。假如15号是星期六,那么15W会在14号(星期五)触发,因为星期四比星期一离15号更近。

C:计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例子:

  • 5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

允许值范围: 1~12 (JAN-DEC),不允许为空值

*:每月触发。例子:0 0 0 1 * ? *代表每月1日执行1

,:指定的时间点触发。例子:0 0 0 1 2,5 ? * 代表2月1日、5月1日执行

-:指定的范围内触发。例子:0 0 0 1 8-12 ? *代表从8月1日开始,12月1日结束,每隔1月执行1次

/:触发步进,/前面的值代表初始值(没有则为0),后面的值代表偏移量。例子:

  • 0 0 0 1 1/2 ? *代表从1月1日开始,每隔2月执行1次
  • 0 0 0 1 /2 ? *代表从1月1日开始,每隔2年执行1次
  • 0 0 0 1 2-10/2 ? *代表从2月1日开始,10月1日结束,每隔2月执行1

允许值范围: 1~7 (SUN-SAT),1代表星期天(一星期的第一天),以此类推,7代表星期六(一星期的最后一天),不允许为空值

* :每星期都触发;

?:与{日期}互斥,即意味着若明确指定{日期}触发,则表示{星期}无意义,以免引起冲突和混乱

, :在指定的星期约定触发。例子:

  • 0 0 0 * * 1,3,5代表星期天、星期二和星期四触发

-:在指定的星期范围内触发,比如2-4代表从星期一开始触发到星期三结束触发,每隔1天触发

/ :触发步进(step),/前面的值代表初始值(等同1),后面的值代表偏移量,例子:

  • 1/3或者/3:从星期天开始触发,每隔3天触发1次

  • 1-5/2:在[1,5]范围内,每隔2天触发,即星期天、星期二、星期四触发

L 如果{星期}占位符如果是L,即意味着星期的的最后一天触发,即星期六触发,L= 7或者 L = SAT,例子:

  • 5L:一个月的最后一个星期四触发

# 用来指定具体的周数,#前面代表星期,#后面代表本月第几周,例子:

  • 2#2:本月第二周的星期一,5#3表示本月第三周的星期四,因此,5L这种形式只不过是#的特殊形式而已

允许值范围: 1970~2099 ,允许为空

*:每年触发。例子:0 0 0 1 1 ? *代表每年1月1日执行1

,:指定的时间点触发。例子:0 0 0 1 1 ? 2022,2023 代表2022年1月1日、2023年1月1日执行

-:指定的范围内触发。例子:0 0 0 1 1 ? 2022-2032代表从2022年1月1日开始到2032年1月1日结束,每隔1年执行1次

/:触发步进,/前面的值代表初始值(没有则为0),后面的值代表偏移量。例子:

  • 0 0 0 1 1 ? 2022/2代表从2022年开始,每隔2年执行1次
  • 0 0 0 1 1 ? /2代表从当前年1月1日开始,每隔2年执行1次
  • 0 0 0 1 1 ? 2022-2032/2代表从2022年1月1日开始,2032年1月1日结束,每隔2年执行1