一、🕒 Spring @Scheduled 常用 Cron 表达式对照表
┌───────────── 秒 (0 - 59)
│ ┌───────────── 分钟 (0 - 59)
│ │ ┌───────────── 小时 (0 - 23)
│ │ │ ┌───────────── 日期 (1 - 31)
│ │ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ │ ┌───────────── 星期 (0 - 7,0/7=周日)
│ │ │ │ │ │
1 2 3 4 5 6
二、🔣 特殊符号说明
| 符号 | 含义 | 示例 |
|---|---|---|
* | 任意值 | 每个时间单位都匹配 |
? | 不指定值(常用于“日”和“星期”冲突时) | |
- | 范围 | 1-5 表示 1 到 5 |
, | 列举 | 1,3,5 表示 1、3、5 |
/ | 步长 | 0/5 表示从 0 开始每隔 5 |
三、💡 常用 Cron 示例
| 说明 | Cron 表达式 |
|---|---|
| 每天凌晨 0 点执行 | "0 0 0 * * ?" |
| 每天中午 12 点执行 | "0 0 12 * * ?" |
| 每隔 5 分钟执行一次 | "0 0/5 * * * ?" |
| 每隔 10 秒执行一次 | "0/10 * * * * ?" |
| 每天的 9 点、12 点、18 点执行 | "0 0 9,12,18 * * ?" |
| 每天 23:30 执行 | "0 30 23 * * ?" |
| 每周一的凌晨 1 点执行 | "0 0 1 ? * MON" |
| 每月 1 号凌晨 2 点执行 | "0 0 2 1 * ?" |
| 每月最后一天 23:59 执行 | "0 59 23 L * ?" |
| 工作日(周一到周五)早上 9 点执行 | "0 0 9 ? * MON-FRI" |
四、🔍 逐位拆解示例
表达式:
@Scheduled(cron = "0 0 0 * * ?")
| 位置 | 值 | 含义 |
|---|---|---|
| 1(秒) | 0 | 在第 0 秒执行 |
| 2(分) | 0 | 在第 0 分执行 |
| 3(时) | 0 | 在第 0 小时(即凌晨 0 点)执行 |
| 4(日) | * | 每天执行,不限制日期 |
| 5(月) | * | 每月执行,不限制月份 |
| 6(星期) | ? | 不指定星期(防止与“日”冲突) |
✅ 综合含义:
每天的凌晨 0 点 0 分 0 秒 执行一次。
五、📘 更多示例
| 含义 | 表达式 |
|---|---|
| 每天中午 12 点执行 | "0 0 12 * * ?" |
| 每隔 5 分钟执行一次 | "0 */5 * * * ?" |
| 每个月 1 号凌晨 0 点执行一次 | "0 0 0 1 * ?" |
| 每天早上 8 点 30 分执行 | "0 30 8 * * ?" |
六、总览
┌───────────── 秒 (0 - 59)
│ ┌───────────── 分钟 (0 - 59)
│ │ ┌───────────── 小时 (0 - 23)
│ │ │ ┌───────────── 日期 (1 - 31)
│ │ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ │ ┌───────────── 星期 (0 - 7,0/7 = 周日)
│ │ │ │ │ │
* * * * * *
### 🔣 特殊符号说明
| 符号 | 含义 | 示例 |
|------|------|------|
| `*` | 任意值 | 每个时间单位都匹配 |
| `?` | 不指定值(常用于“日”和“星期”冲突时) | |
| `-` | 范围 | `1-5` 表示 1 到 5 |
| `,` | 列举 | `1,3,5` 表示 1、3、5 |
| `/` | 步长 | `0/5` 表示从 0 开始每隔 5 |
### 💡 常用 Cron 示例
| 说明 | Cron 表达式 |
|------|--------------|
| 每天凌晨 0 点执行 | `"0 0 0 * * ?"` |
| 每天中午 12 点执行 | `"0 0 12 * * ?"` |
| 每隔 5 分钟执行一次 | `"0 0/5 * * * ?"` |
| 每隔 10 秒执行一次 | `"0/10 * * * * ?"` |
| 每天的 9 点、12 点、18 点执行 | `"0 0 9,12,18 * * ?"` |
| 每天 23:30 执行 | `"0 30 23 * * ?"` |
| 每周一的凌晨 1 点执行 | `"0 0 1 ? * MON"` |
| 每月 1 号凌晨 2 点执行 | `"0 0 2 1 * ?"` |
| 每月最后一天 23:59 执行 | `"0 59 23 L * ?"` |
| 工作日(周一到周五)早上 9 点执行 | `"0 0 9 ? * MON-FRI"` |
### 🔍 逐位拆解示例
**表达式:**
@Scheduled(cron = "0 0 0 * * ?")
| 位置 | 值 | 含义 |
|------|----|------|
| 1(秒) | `0` | 在第 0 秒执行 |
| 2(分) | `0` | 在第 0 分执行 |
| 3(时) | `0` | 在第 0 小时(即凌晨 0 点)执行 |
| 4(日) | `*` | 每天执行,不限制日期 |
| 5(月) | `*` | 每月执行,不限制月份 |
| 6(星期) | `?` | 不指定星期(防止与“日”冲突) |
✅ **综合含义:**
> 每天的凌晨 **0 点 0 分 0 秒** 执行一次。
* ### 📘 更多示例
| 含义 | 表达式 |
|------|--------|
| 每天中午 12 点执行 | `"0 0 12 * * ?"` |
| 每隔 5 分钟执行一次 | `"0 */5 * * * ?"` |
| 每个月 1 号凌晨 0 点执行一次 | `"0 0 0 1 * ?"` |
| 每天早上 8 点 30 分执行 | `"0 30 8 * * ?"` |
📚 **小贴士:**
- Spring 的 `@Scheduled` 默认使用服务器本地时区(可用 `zone` 参数指定)。
- 如果计划任务不执行,请检查:
1️⃣ `@EnableScheduling` 是否已在配置类上启用;
2️⃣ Bean 是否被 Spring 管理;
3️⃣ Cron 表达式是否符合 Quartz 标准(6 位而非 7 位)。