简介

定时任务,就是能够在规定时间内重复执行的任务。而定义定时任务的表达式就是 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