目录
cron表达式的格式:
cron表达式一般为6位或者7位,多的一位就是最末尾的年分,可省略不写,每一位对应的时间为:
【秒】【分】【时】【日】【月】【周几/星期几】【年(可省略)】
常用符号说明:
【*】 表示任意值都满足触发条件
【,】
表示列表项目的分割,如 秒数中设置 1,3,17,则表示秒数为1,3,17时满足触发条件
【-】
表示连续的列表范围,如 秒数中设置 1-5,则表示秒数为1到5时,均满足触发条件
【/】
正常的用法为 x/y,x表示触发的起始数值,y表示后续间隔,如 秒数中设置 5/20,则表示从第5秒开始触发,然后每隔20秒再循环触发(25、45,下次循环5、25、45…)
示例:
0 0 10,14,18 * * ? 每天10、14、18点触发任务
0 0/20 9-17 * * ? 每天9-17点,20分钟触发任务
0 * 12 * * ? 每天12:00 - 12:59期间的每1分钟触发
0 0/3 12 * * ? 在每天12:00 - 12:59期间的每3分钟触发
0 0-5 12 * * ? 在每天12:00 - 12:05期间的每1分钟触发
表达式中的【?】即:关于【日期】与【星期几】的说明
在cron表达式中,日期(日)和星期(星期)通常有以下几种解释方式:
-
或关系(OR):这是最常见的解释方式,特别是在Unix/Linux系统的标准cron中。如果表达式中的日期或星期任一条件满足,任务就会被触发。例如,如果设置为
29 5 4
(即每年5月29日或每周四),那么只要这两个条件中的任何一个达成,任务就会执行。 -
与关系(AND):在一些高级调度系统(如Quartz Scheduler)中,可以配置cron表达式的解释方式,使日期和星期必须同时满足才触发任务。这种情况下,只有当日期确实是星期四的时候任务才会执行。
以0 0 12 29 5 4 2024
这个表达式为例:
- Unix/Linux的Cron:通常解释为“在2024年5月29日或2024年的每个星期四”执行,这意味着任务会在5月的每个星期四和5月29日执行,不管那天是不是星期四。
- Quartz Scheduler:如果配置为精确匹配,这个表达式可能只在2024年5月29日且那天是星期四时触发。如果这一天不是星期四,任务就不会执行。
所以说:【日期】与【星期几】中任何一个设置值(包含 *
),另一个尽量使用 ?
来进行屏蔽,此时 的【?】起到屏蔽的作用。
当星期和日期都为【*】或数字时,非法,
当星期和日期都为【?】时,非法
【?】只能出现在【日期】与【星期几】中,且不能同时出现, 比如以下是 每10秒触发任务的表达式
10 * * * * ? //合法
10 * * * ? * //合法
10 * * * ? ? //非法
10 * * * * * //非法
补充说明:
在cron表达式中,星期字段的解释通常是从0开始,其中0代表星期日。所以,数字0到6分别代表星期日到星期六。
举例:
10 * * * * ? 每10秒触发任务
10 10 * * * ? 每小时的10分10秒触发任务
10 10 1 * * ? 每天1点10分10秒触发任务
0 0 10,14,18 * * ? 每天10、14、18点触发任务
0 0/20 9-17 * * ? 每天9-17点,20分钟触发任务
0 * 12 * * ? 每天12:00 - 12:59期间的每1分钟触发
0 0/3 12 * * ? 在每天12:00 - 12:59期间的每3分钟触发
0 0-5 12 * * ? 在每天12:00 - 12:05期间的每1分钟触发
10 10 1 12 * ? 每月12号1点10分10秒触发任务
10 10 1 ? * 2 每周1的1点10分10秒触发任务
10 10 1 20 10 ? 2021 2021年10月20号1点10分10秒触发任务
10 10 1 * 10 ? 2021 2021年10月每天1点10分10秒触发任务
10 10 1 ? 10 * 2021 2021年10月每天1点10分10秒触发任务
10 10 1 ? 10 7 2021 2021年10月每周6 1点10分10秒触发任务