前言
Cron表达式是一种用于描述定时任务执行时间的字符串格式,这种表达式基于时间字段来定义任务应该在哪些时间点执行,通常包含六个或七个用空格隔开的字段,分别代表秒、分钟、小时、日期、月份和星期(年份是可选的)。
每个字段都可以是数字、星号、逗号、减号、正斜杠和问号等特殊字符的组合。星号代表匹配任意值,逗号用于列举值,减号表示值范围,正斜杠表示步长,问号用于日期和星期字段作为占位符。例如,一个Cron表达式 "0 0 12 ? * WED" 表示每星期三的中午12:00执行任务。
SUN-SAT(周中天) :1-7(1 = 星期日) 和 SUN, MON, TUE, WED, THU, FRI, SAT
JAN-DEC(月) :1-12 和 JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
一、语法结构
Cron表达式的基本语法可以表示为{秒数} {分钟} {小时} {日期} {月份} {星期} {年份}(年份可为空)。具体来说:
秒数:0~59之间的整数,用于指定分钟内的具体秒数。
分钟:0~59之间的整数,用于指定小时内的具体分钟数。
小时:0~23之间的整数,用于指定一天中的具体小时数。
日期:1~31之间的整数,用于指定每月中的具体日期。
月份:1~12之间的整数,用于指定具体月份。
星期:0(代表周日)~7(代表周一),用于指定具体星期数。
二、特殊字符
- ?字符: 表示不确定的一个值,即任意一个合法值, 如每月的8号触发一个操作,但不关心是周几,我们可以这么设置 0 0 0 8 * ?。
- ,字符: 表示数个值,即枚举,如在分域中定义8,12,35, 表示分别在第8分,第12分 第35分执行该定时任务。
- -字符: 表示连续的范围,如在时域中定义20-22,表示在20,21,22点每小时触发一次。
- *字符: 表示所有值,可解读为 “每”, 如在分域中定义*,表示每分钟都会触发任务,在日域中定义*,表示每天触发任务。
- /字符: 表示指定一个值的增加幅度。n/m表示从n开始,每次增加m, 如在 秒上定义5/10 表示从 第 5 秒开始 每 10 秒执行一次。
- #字符: 表示表示每月的第几个周几,只能作用于周上。例如2#3表示在每月的第三个周二。
- L字符: 表示表示英文中的LAST 的意思,只能在 日和周中使用, 其中,在日中设置表示当月的最后一天,在周中设置表示周六,相当于7或SAT
- W字符: 表示离给定日期最近的工作日(周一到周五), 只能在日中使用且只能用在具体的数字之后. 如在日上置15W,表示离每月15号最近的那个工作日触发。假如15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果是1W就只能往本月的下一个最近的工作日推不能跨月往上一个月推。
三、常用cron表达式例子
[A秒] [B分] [C时] [D日] [E月] [F星期] [G年]0 0 10,14,16 * * ? 每天上午10点,下午2点,4点0 0 12 ? * WED 表示每个星期三中午12点0 0 12 * * ? 每天中午12点触发0 15 10 ? * * 每天上午10:15触发0 15 10 * * ? 每天上午10:15触发0 15 10 * * ? 2022 2022年的每天上午10:15触发0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发0 15 10 ? * MON-FRI 周一至周五的上午10:15触发0 15 10 15 * ? 每月15日上午10:15触发0 15 10 L * ? 每月最后一日的上午10:15触发0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发0 15 10 ? * 6L 2022-2023 2022年至2023年的每月的最后一个星期五上午10:15触发0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发0 0 23 * * ? 每天23点执行一次0 0 1 * * ? 每天凌晨1点执行一次0 0 1 1 * ? 每月1号凌晨1点执行一次0 0 23 L * ? 每月最后一天23点执行一次0 0 1 ? * L 每周星期天凌晨1点执行一次0 20,35,55 * * * ? 在20分、35分、55分执行一次0 0 0,13,18,21 * * ? 每天的0点、13点、18点、21点都执行一次0/2 * * * * ? 表示每2秒 执行任务0 0/2 * * * ? 表示每2分钟 执行任务0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务