一、背景介绍

Cron 表达式,最初是应用于· Unix 系统中的 crontab 命令,用于设置周期性被执行的指令。Cron 表达式应用广泛,在服务器中,可以利用 linux 的 cron 服务定时执行一些脚本;在 Java Web 中,利用 cron 可以实现任务的定时执行。

本文将介绍 Cron 表达式的语法,理解 Cron 表达式的构成。

二、Cron 语法

Cron 表达式由6位或7位由空格分隔的时间字段构成,Cron 表达式忽略字符和特殊值的大小写,具体如下表所示。

位置 含义 允许数值 允许特殊值
1 0 ~ 59 , - * /
2 分钟 0 ~ 59 , - * /
3 小时 0 ~ 23 , - * /
4 日期 1 ~ 31
但也与具体月份有关,不是每个月都有31日
, - * ? / L W C
5 月份 1 ~ 12 或
JAN - DEC
, - * /
6 星期 1 ~ 7 或
SUN,MON,TUE,WED,THU,FRI,SAT【注:周日是第一天】
, - * ? / L C #
7 年份(可选) 1970 ~ 2099 , - * /

数值的含义好理解,除了数值外,每个字段还允许使用一些特殊字符,其含义如下:

  • *:表示所在时间域所有可能的值。例如,在分钟字段时表示每分钟都会执行;
  • ,:表示一个列表值。例如,在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;
  • -:表示一个范围。例如,在小时字段中使用“10-12”,则表示从10到12点,即10,11,12点;
  • /:表示数值的增量/ 左侧表示起始值,右侧表示增量,终止值为该字段最大值。例如,在分钟字段中使用“0/15”,则表示为0,15,30,45秒,而“5/15”表示5,20,35,50秒;
  • ?:表示占位符,没有实际意义,存在于日期和星期字段中;
  • L:表示**“最后**”的意思,存在于日期和星期字段中。
    • 当出现在日期字段中,表示这个月的最后一天,如一月份的31日,四月份的30日。
    • 当单独出现在星期字段中,表示该星期的最后一天,即等价于 7 或 SAT,表示周六。
    • 当配合数值出现在星期字段中,表示该月的最后一个星期几。例如“6L”表示该月的最后一个星期五。
  • W:表示离日期最近的工作日,存在于日期字段中。
    • 例如“15W”表示离15日最近的工作日,如果15日是周六,那么结果就是14日周五;如果15日是周日,那么结果就是16日周一;如果15日是周一,那么结果就是15日周一。
    • 另外 W不能跨月。例如1日是周六,那么“1W”结果是3W周一,而不是上个月的周五。
  • C:表示“DayOfWeek”和“DayOfMonth”的意思,即每周/每月的第N天,存在于日期和星期字段中。
    • 日期字段中,“5C”表示每个月的第5天。
    • 星期字段中,“5C”表示每周的第五天,即每周四。
  • #:表示每个月的第几个星期几,存在于星期字段中。例如“3#3”表示每个月第三个的星期二,“7#5”表示每个月的第5个星期六。

三、例子实战

Cron Desc Remark
0 0 12 * * ? 每天中午12点执行
0 15 10 * * ? 2019 2019年每天10点15分执行
0 0/5 14,18 * * ? 每天14:0014:55每5分钟执行<br>每天18:0018:55每5分钟执行 分钟取值范围为0~59
因此“0/5”应该是0,5,10……55
0 10,44 14 ? 3 WED 三月份的每个星期三,14:10分和14:44执行
0 15 10 ? * 6L 每个月的最后一个星期五的10:15执行
0 15 10 ? * 6#3 每个月的第三个星期五的10:15执行
0 15 10 ? * MON-FRI 每个月的星期一到星期五的10:15执行