定时任务(Spring @Scheduled)

42 阅读3分钟

一、🕒 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 位)。