定时任务配置表达式(通常称为 Cron 表达式)是一种用于定义任务执行时间的字符串格式,广泛应用于 Linux 的 cron
服务、Java 的 Quartz
、Spring 的 @Scheduled
等场景。以下是详细教程:
一个标准的 Cron 表达式由 6或7个字段 组成(不同工具可能略有差异),分别表示秒、分、时、日、月、周(和年)。格式如下:
┌───────────── 秒(0-59)
│ ┌─────────── 分(0-59)
│ │ ┌───────── 时(0-23)
│ │ │ ┌─────── 日(1-31)
│ │ │ │ ┌───── 月(1-12 或 JAN-DEC)
│ │ │ │ │ ┌─── 周(0-7,0和7均为周日,或 SUN-SAT)
│ │ │ │ │ │
│ │ │ │ │ │
* * * * * * [年](可选)
字段 | 允许值 | 特殊字符 | 说明 |
---|---|---|---|
秒 | 0-59 | , - * / |
Linux cron 通常省略秒字段 |
分 | 0-59 | , - * / |
|
时 | 0-23 | , - * / |
|
日 | 1-31 | , - * / ? L W |
L 表示最后一天,W 工作日 |
月 | 1-12 或 JAN-DEC | , - * / |
|
周 | 0-7 或 SUN-SAT | , - * / ? L # |
# 表示第几个周几(如 6#3 第三个周五) |
年(可选) | 1970-2099 | , - * / |
通常省略 |
特殊字符含义:
- *
:任意值(如 *
在分钟字段表示每分钟)
- ,
:多个值(如 MON,WED,FRI
)
- -
:范围(如 10-20
在日字段表示10日到20日)
- /
:步长(如 0/15
在秒字段表示每15秒)
- ?
:不指定(仅用于日或周字段,避免冲突)
- L
:最后(如 L
在日字段表示月末)
- W
:最近工作日(如 15W
表示当月15日最近的工作日)
表达式 | 说明 |
---|---|
0 * * * * ? |
每分钟的0秒触发 |
0 0/5 * * * ? |
每5分钟触发一次 |
0 0 12 * * ? |
每天中午12点触发 |
0 15 10 ? * MON-FRI |
每周一到周五的10:15触发 |
0 0 8 1 * ? |
每月1日8:00触发 |
0 0 6 L * ? |
每月最后一天的6:00触发 |
0 0 12 ? * 6#3 |
每月第三个周五中午12:00触发 |
0 0 0 31 12 ? |
每年12月31日午夜触发 |
java
@Scheduled(cron = "0 0 8 * * ?") // 每天8点执行
public void task() { /* ... */ }
bash
# 每天凌晨3点执行脚本
0 3 * * * /path/to/script.sh
spring.task.scheduling.timezone=Asia/Shanghai
)。2月30日
或 每周一和每月1日
需避免逻辑矛盾。通过以上规则,你可以灵活配置各种定时任务。如果有具体场景需求,可以进一步优化表达式!