内容提要
Cron表达式由秒、分、时、日、月、周、年7个域组成(年可省略),以空格分隔。各域支持逗号(列举)、连字符(范围)、星号(任意)、斜杠(间隔)等符号;日和周域还支持问号、L、W、C、#等特殊符号。例如“0 15 10 ? * 6#3”表示每月第三个星期五10:15触发。
延伸解读
日与周域互斥:理解问号(?)的必要性
在cron表达式中,日(DayOfMonth)和周(DayOfWeek)两个域是互斥的,不能同时指定具体值。如果希望每月20日触发,而不关心是星期几,必须将周域设为?,写作“1 1 1 20 * ?”。若误用*,则表示“无论星期几都触发”,与每月20日的意图冲突。因此,?用于明确表示“不设置该域”,避免歧义。
W符号的工作日触发逻辑与边界
W用于日域,表示离指定日期最近的工作日。例如5W:若5日是工作日则当天触发;若5日是周六,则提前到4日(周五);若5日是周日,则推迟到6日(周一)。W不会跨月,如1W若1日是周六,则顺延到3日(下周一),而不会回溯到上个月。这确保了触发始终在当月内。
L符号在日与周域中的不同含义
L表示“最后”。在日域中,L代表每月最后一天,如“0 15 10 L * ?”表示每月最后一天10:15触发。在周域中,L需与数字结合,如6L表示每月最后一个周五(6代表周五)。此外,L和W可联合使用为LW,表示当月最后一个工作日。注意L在不同域中含义不同,需结合位置理解。
C符号:基于日历的复杂触发
C是Calendar的缩写,仅用于日和周域,表示基于关联日历计算的值。若未关联日历,则等同于所有日期。例如日域的4C表示当月第4天或之后日历中的第一天;周域的1C表示当月第一周或之后日历中的第一天。C依赖Quartz的Calendar对象,可自定义排除节假日。例如10号放假,10C会指向11号。由于用法较复杂,实际中较少使用。
Q&A
cron表达式由哪几部分组成?
cron表达式由7个域组成,依次为:秒、分、时、日、月、周、年,各域之间用空格分隔。其中年域可以省略。
cron表达式中各个域的取值有什么限制?
秒:0-59;分:0-59;时:0-23;日:1-31;月:1-12(或JAN-DEC);周:1-7(或SUN-SAT);年:1970-2099(可留空)。
cron表达式中星号(*)和问号(?)有什么区别?
星号(*)表示匹配该域的任意值,可以用在所有域中;问号(?)只能用在日和周域,表示不指定该域的值,因为日和周域互斥,需要用一个问号来忽略其中一个。
cron表达式中L、W、#符号分别代表什么?
L表示“最后”,在日域表示每月最后一天,在周域表示某月的最后一个星期几(如6L表示最后一个周五);W表示工作日,在日域使用,表示离指定日期最近的工作日;#用于指定某月的第几个星期几(如6#3表示第三个星期五)。
如何用cron表达式表示每月第三个星期五的10:15?
可以使用表达式:0 15 10 ? * 6#3。其中6表示星期五,#3表示第三个。
cron表达式对大小写敏感吗?
cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。