Cron 表达式提供了指定复杂时间组合的能力
Cron 表达式由 6 个必填字段和一个由空格分隔的可选字段组成。各字段分别说明如下:
字段名 | 允许的值 | 允许的表达式 |
---|---|---|
秒 | 0-59 | , - * / |
分钟 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
每月的某天 | 1-31 | , - * ? / L W |
月 | 0-11 or JAN-DEC(0代表一月) | , - * / |
每周的某天 | 1-7 or SUN-SAT(1代表星期天) | , - * ? / L # |
年(可选) | empty, 1970-2199 | , - * / |
表达式
* 所有 例子 每秒执行一次: * * * * * ?
- 范围 例子 1-20秒执行一次: 1-20 * * * * ?
, 枚举 例子 1和20秒执行一次: 1,20 * * * * ?
/ 间隔 例子 从1秒开始每20秒执行一次: 1/20 * * * * ?
L 最后的 例子 月份字段中的值“L”表示“月份的最后一天,“6L”表示“本月的最后一个星期五”,“L-3”,表示日历月的倒数第三天
W 允许用于日期字段。此字符用于指定离给定日期最近的工作日(周一至周五)。例如,如果您将“15W”指定为 day-of-month 字段的值,则含义是:“距该月 15 日最近的工作日”。因此,如果 15 日是星期六,触发器将在 14 日星期五触发。如果 15 日是星期日,触发器将在 16 日星期一触发。如果 15 号是星期二,那么它将在 15 号星期二触发。但是,如果您将“1W”指定为月份中的某天的值,并且 1 号是星期六,则触发器将在 3 号星期一触发,因为它不会“跳跃”超过一个月的天数。 'W' 字符只能在月中的某一天是一天而不是一个范围或日期列表时指定。
LW 可以实现本月的最后一个工作日
# 星期字段允许使用“#”字符。此字符用于指定该月的“第 n”XXX 天。例如,星期字段中“6#3”的值表示该月的第三个星期五(第 6 天 = 星期五,“#3” = 该月的第三个星期五)。其他示例:“2#1”= 本月的第一个星期一,“4#5”= 本月的第五个星期三。请注意,如果您指定“#5”并且该月中给定的星期几没有 5,则该月不会触发。如果使用“#”字符,则在星期几字段中只能有一个表达式(“3#1,6#3”无效,因为有两个表达式)。
合法字符以及月份和星期几的名称不区分大小写。
注意点
对指定星期几和月份中的某天值的支持不完整(您需要在这些字段之一中使用“?”字符)。
支持溢出范围 - 也就是说,左侧的数字大于右侧的数字。你可能会做 22-2 赶上晚上 10 点到凌晨 2 点,或者你可能有 11 月到 2 月。需要注意的是,过度使用溢出范围会创建没有意义的范围,并且没有努力确定 CronExpression 选择哪种解释。一个例子是“0 0 14-6 ? * FRI-MON”。
PS:源码注解翻译