关于Cron表达式的一些了解
Cron表达式含义
秒 分 时 日 月 星期 年
- 表达式中的年,在不指定的情况下,直接忽略即可;如下列子都不指定年
- 可以五位:
此时不包含秒的信息
例如每天10:15执行定时任务
15 10 * * *
- 可以六位,包含秒(例如 Quartz Scheduler):
每天10:15:16执行定时任务
16 15 10 * * *
Cron表达式中的*
,?
,有什么区别,能否混用?
在 Cron 表达式中,* 和 ? 都表示“匹配任何值”,但它们的用法和含义有些不同。
*
(星号):表示“每个可能的值”。- 例如,在分钟字段上写
*
,表示“每分钟都匹配”
。 - 在日字段上写
*
,表示“每天都匹配”
。
- 例如,在分钟字段上写
?
(问号):表示“没有指定特定值”
。- 主要用于日期字段和星期字段中,表示“不指定具体值”。
- 它通常用于避免和其他字段的冲突。例如,在日字段使用 ?,如果你在星期字段上已指定某个特定值,就可以避免日和星期之间的冲突。
能否混用:
- 是的,可以混用,但需要遵循规则。通常,
?
只用于“日”和“星期”字段,用来避免二者的冲突,而*
可以在所有字段中使用。
区别:
*
是“每个值”,适用于任何字段。
?
是“不指定”,只适用于“日”和“星期”字段,目的是避免它们之间的相互影响。
举个例子:
0 12 * * ?
:每天中午12点触发,不指定具体的星期几(用 ? 代替星期字段)。
0 12 1 * *
:每月1号中午12点触发,不指定具体的星期几(使用 * 在星期字段表示“每个星期”)。
表示范围及应用
秒(0-59)
分钟(0-59)
小时(0-23)
日期(1-31)
月份(1-12 或 JAN-DEC)
星期(0-7 或 SUN-SAT,0 和 7 都表示星期日)
年份(可选字段,留空或 1970-2099)
*
:表示任何值。例如在分钟字段使用 * 表示每分钟都触发。,
:用来列出枚举值。例如在星期字段使用 MON,WED,FRI 表示星期一、星期三和星期五触发。-
:表示一个范围。例如在小时字段使用 9-17 表示在 9 点到 17 点之间触发。/
:表示步进值。例如在分钟字段使用 */5 表示每 5 分钟触发一次。?
:表示不指定值,通常用于日期和星期字段中的一个,以避免冲突。L
:表示最后,例如在日期字段使用 L 表示月份的最后一天。W
:表示最接近指定日的工作日(周一至周五)。例如在日期字段使用 15W 表示最接近每月 15 日的工作日。#
:表示每月的第几个星期几。例如在日期字段使用 2#1 表示每月的第一个星期二。
举例
0 15 10 ? * MON-FRI
:
含义:周一到周五上午 10:15 触发。
解释:秒(0),分钟(15),小时(10),日期(不指定),月份(每月),星期(周一到周五)。
0 0 0 L * ?
:
每月最后一天零点触发。
0 0 0 1W * ?
:
含义:每月最近一个星期一凌晨 0 点触发。
解释:秒(0),分钟(0),小时(0),日期(最近一个星期一),月份(每月),星期(不指定)。