Cron表达式是一种用于配置定时任务执行时间的字符串,在java应用开发中被广泛应用于任务调度框架(如Quartz)的任务执行时间。
一、Cron表达式的结构
一个标准的Cron表达式由 7个字段组成,字段间用空格分隔。各字段顺序如下:
| 字段 | 取值范围 | 支持的符号 | 说明 |
|---|---|---|---|
| 秒 (Seconds) | 0-59 | * , - / ? L # | 分钟内的秒数(Quartz特有字段) |
| 分 (Minutes) | 0-59 | * , - / | 小时内的分钟数 |
| 时 (Hours) | 0-23 | * , - / | 一天中的小时数 |
| 日 (Day of Month) | 1-31 | * , - / ? L W | 月份中的日期 |
| 月 (Month) | 1-12 或 JAN-DEC | * , - / | 月份 |
| 周 (Day of Week) | 0-7 或 SUN-SAT | * , - / ? L # | 星期(0和7均代表星期日) |
| 年 (Year) [可选] | 1970-2099 | * , - / | 年份(Quartz特有字段) |
注意:
配置cron表达式时应该从左到右进行配置,依次为秒、分、时、日、月、周、年
在Java中使用Quartz等调度框架 时通常使用6个字段(秒、分、时、日、月、周),年为可选字段。
二、字符详解
| 字符 | 说明 | 示例 |
|---|---|---|
* | 匹配任意值 | * * * * * ? 每分钟执行 |
, | 指定多个值 | 0 5,15 * * * ? 每小时5分和15分执行 |
- | 指定范围 | 0 9-17 * * * ? 9点到17点每小时执行 |
/ | 步长(间隔触发) | 0 0/5 * * * ? 每5分钟执行(从0分开始) |
? | 不指定值(仅用于日和周字段,互斥逻辑) | 0 0 12 * * ? 每天中午12点执行 |
L | 最后(Last): - 日字段:月份最后一天(如L) - 周字段:星期六(如6L) | 0 0 0 L * ? 每月最后一天零点执行 |
W | 最近工作日(Workday),避免周末 | 0 0 0 15W * ? 每月15日最近的工作日执行 |
# | 指定第N个周几 | 0 0 12 ? * 2#3 每月第3个周一中午12点执行 |
三、陷阱
- 日与周字段互斥
- 避免同时指定日和周字段的值(除非需要两者独立触发)。
- 使用
?忽略其中一个字段(例如:0 0 0 ? * MON或0 0 0 1 * ?)。
- 取值范围冲突
- 日期字段需考虑月份天数(如2月30日无效)。
- 周字段:
1-7(1=周日, 2=周一, …, 7=周六)或SUN-SAT。
- L/W/#的兼容性
L,W,#仅部分系统支持(如Quartz)。
四、示例
基础场景
| 描述 | Cron表达式 | 说明 |
|---|---|---|
| 每分钟执行 | 0 * * * * ? | 每分钟的0秒触发 |
| 每小时15分30秒执行 | 30 15 * * * ? | 每小时的第15分30秒触发 |
| 每天凌晨3点执行 | 0 0 3 * * ? | |
| 每月1日中午12点执行 | 0 0 12 1 * ? | |
| 每周五下午4点执行 | 0 0 16 ? * FRI | 忽略日字段 |
| 2025年每小时执行 | 0 0 * * * ? 2025 | Quartz特有(带年份) |
复杂场景
| 描述 | Cron表达式 | 说明 |
|---|---|---|
| 工作日上午9点到下午5点,每30分钟执行 | 0 0/30 9-17 ? * MON-FRI | MON-FRI :周一至周五 |
| 每月最后一天18点执行 | 0 0 18 L * ? | L表示最后一天 |
| 每月第3个周三上午10点执行 | 0 0 10 ? * 4#3 | 4=周四(周日=0),#3=第3个 |
| 每日8:00至17:00,每20分钟执行 | 0 0/20 8-17 * * ? | 从8:00, 8:20, …, 16:40, 17:00 |
| 每月15日最近的工作日执行 | 0 0 0 15W * ? | 15W: 15日最近的工作日(避开周末) |
总结
- cron表达式从左到右,依次为秒、分、时、日、月、周、年
- cron表达式中年为可选字段
- 避坑:日/周字段互斥时用
?,验证取值范围,避免冲突。
熟悉cron表达式的使用,可以有效的提高我们配置定时任务时的工作效率,通过不同的组合,以满足不同任务的执行需求。
9637

被折叠的 条评论
为什么被折叠?



