cron 表达式

cron 的表达式是字符串,实际上是由七子表达式(从左到右),描述个别细节的时间表。

这些子表达式是分开的空白。

介绍

顺序 说明 数字 字符
1 Seconds(秒) 0~59 的整数 ,和-和*和/
2 Minutes(分) 0~59 的整数 ,和-和*和/
3 Hours(小时) 0~23 的整数 ,和-和*和/
4 Day-of-Month(日期) 1~31 的整数 ,和-和*和/和?和L和W和C
5 Month(月份) 1~12 的整数或者 JAN-DEC ,和-和*和/
6 Day-of-Week(星期) 1~7 的整数或者 SUN-SAT ,和-和*和/和?和L和W和C
7 Year (可选字段) 1970~2099 ,和-和*和/

特殊字符说明:

字符 适用域 含义 例子
* ALL 表示匹配该域的任意值。  
? 只在 DayofMonth 和 DayofWeek 也表示匹配域的任意值,但实际不会。因为 DayofMonth 和 DayofWeek 会相互影响。 例如想在每月的 20 日触发调度,不管 20 日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用,如果使用表示不管星期几都会触发,实际上并不是这样。
- ALL 表示范围。 例如在 Minutes 域使用 5-20,表示从 5 分到 20 分钟每分钟触发一次
/ ALL 表示起始时间开始触发,然后每隔固定时间触发一次 例如在 Minutes 域使用 5/20, 则意味着 5 分钟触发一次,而 25,45 等分别触发一次
, ALL 表示列出枚举值 在 Minutes 域使用 5,20,则意味着在 5 和 20 分每分钟触发一次
L 只在 DayofMonth 和 DayofWeek 表示最后 如果在 DayofWeek 域使用 5L, 意味着在最后的一个星期四触发
W DayofMonth 表示有效工作日 (周一到周五)。系统将在离指定日期的最近的有效工作日触发事件。 例如:在 DayofMonth 使用 5W,如果 5 日是星期六,则将在最近的工作日:星期五,即 4 日触发。如果 5 日是星期天,则在 6 日 (周一) 触发;如果 5 日在星期一到星期五中的一天,则就在 5 日触发。另外一点,W 的最近寻找不会跨过月份 。
LW DayofWeek 这两个字符可以连用,表示在某个月最后一个工作日。 有可能不是星期五,例如:某个月的 31 号为周二,那么此满足最后一个工作日,但不是周五。
# DayofMonth 用于确定每个月第几个星期几。 例如在 4#2,表示某月的第二个星期三。

相关框架

CronExpBuilder

cron-utils-更加易于阅读

cron-实现

Cron

软件工具 Cron 是 Unix-like 计算机操作系统中的基于时间的作业调度器。

字段 必填 允许的值 允许的特殊字符 备注
0-59 * , - -
0-59 * , - -
0-23 * , - -
日期 1-31 * , - ? L W -
月份 1-12 或 JAN-DEC * , - -
星期 0-6 或 SUN-SAT * , - ? L # -
年份 1970–2099 * , - 该字段在标准/默认实现中不受支持。

非标准字符

L

‘L’ 代表 “last”(最后)。当用于星期几字段时,它允许你指定诸如 “本月最后一个星期五”(”5L”)这样的构造。在月份字段中,它指定月份的最后一天。

W

字符 ‘W’ 允许在月份字段中使用。该字符用于指定距离给定日期最近的工作日(星期一至星期五)。例如,如果你指定月份字段的值为 “15W”,意味着:”距离本月15号最近的工作日”。因此,如果15号是星期六,触发器在14号星期五触发。如果15号是星期天,则触发器在16号星期一触发。如果15号是星期二,那么在15号星期二触发。但是,如果你指定 “1W” 作为日期字段的值,而1号是星期六,触发器在3号星期一触发,因为它不会 ‘跳过’ 一个月的天数边界。字符 ‘W’ 只能在日期字段是单一天时使用,不能用于日期范围或天数列表。

井号 ( # )

’#’ 在星期几字段中允许使用,并且必须后跟一个介于一和五之间的数字。它允许你指定诸如 “本月第二个星期五” 这样的构造。

问号 ( ? )

在某些实现中,用于代替 ‘*‘,表示日期字段或星期几字段留空。其他 cron 实现将 “?” 替换为 cron 守护进程的启动时间,因此如果 cron 在上午8:25启动,则 ? ? * * * * 将更新为 25 8 * * * *,并在每天此时间运行直到再次重启。

斜杠 ( / )

在 vixie-cron 中,斜杠可以与范围结合,指定步长值。例如,在分钟字段中的 */5 表示每 5 分钟执行一次(参见备注)。这是更冗长的 POSIX 表达形式 5,10,15,20,25,30,35,40,45,50,55,00 的缩写。POSIX 对斜杠未定义用途;其理由(评论一个 BSD 扩展)指出定义基于 System V 格式,但不排除扩展的可能性。请注意,通常不能表达频率;只有能够平均划分其范围的步长值表达准确的频率(例如,对于分钟和秒,即 /2、/3、/4、/5、/6、/10、/12、/15、/20 和 /30,因为 60 可以被这些数字均匀整除;对于小时,即 /2、/3、/4、/6、/8 和 /12);所有其他可能的 “步长” 和所有其他字段在时间单位结束时产生不一致的 “短” 时期,然后 “重置” 到下一分钟、秒或天;例如,对于日期字段输入 */5 有时在 1、2 或 3 天后执行,这取决于月份和闰年;这是因为 cron 是无状态的(不记住上次执行的时间,也不计算它与现在的差异,这对于准确计算频率是必需的—相反,cron 只是一个纯粹的模式匹配器)。

个人思考

你可以为这个设计一个网站吗?

可以为这个设计一个 cron 框架,并且结合到 job 等任务调度框架中吗?

指定某一天定时执行

我想要一个代表2010年9月6日上午6:00的cron表达式

0 0 6 6 9 ? 2010
| | | | | |   |
| | | | | |   +- 2010 only.
| | | | | +----- any day of the week.
| | | | +------- 9th month (September).
| | | +--------- 6th day of the month.
| | +----------- 6th hour of the day.
| +------------- Top of the hour (minutes = 0).
+--------------- Top of the minute (seconds = 0).

这个还是比较好用的,平时没有很注意。

这里保留处理一下。

参考资料

Cron 表达式介绍

Cron 表达式学习