Cron表达式是一种用于配置定时任务的时间表达式,广泛应用于Unix/Linux系统的crontab、Spring框架的@scheduled注解、云平台的定时触发器以及各类调度工具中。掌握Cron表达式是进行自动化任务调度的基础技能。
标准的五字段Cron表达式格式如下:
每个字段使用数字或特殊字符表示取值范围,字段之间用空格分隔。整体语法格式为:
各字段的详细取值范围和说明如下:
| 字段 | 取值范围 | 说明 |
|---|---|---|
| 分钟(Minute) | 0 - 59 | 指定每小时的第几分钟执行任务 |
| 小时(Hour) | 0 - 23 | 指定每天的第几小时执行任务 |
| 日(Day of Month) | 1 - 31 | 指定每月的第几天执行任务 |
| 月(Month) | 1 - 12 | 指定每年的第几月执行任务 |
| 周(Day of Week) | 0 - 7 | 指定每周的第几天执行任务,0和7均表示星期日 |
0 0 1 * 0 表示每月1日或每周日0点都会执行。
Cron表达式支持多种特殊字符(通配符),用于灵活定义执行时间。以下逐一说明每个特殊字符的含义和用法:
| 字符 | 名称 | 含义 | 示例 |
|---|---|---|---|
* | 星号 | 所有可能的值,表示该字段的每一个合法值 | 0 * * * * 每小时整点执行 |
, | 逗号 | 列举多个值,用于指定多个离散的取值 | 0 9,18 * * * 每天9:00和18:00执行 |
- | 连字符 | 指定一个范围(包含两端),表示从起点到终点的连续区间 | 0 9-17 * * * 每天9点到17点整点执行 |
/ | 斜杠 | 步长,表示从起始值开始每隔指定单位执行一次 | */5 * * * * 每5分钟执行一次 |
L | Last | 最后,在"日"字段中表示月的最后一天;在"周"字段中表示周的最后一天(星期六) | 0 0 L * * 每月最后一天0点执行 |
W | Weekday | 工作日,仅用于"日"字段,表示距离指定日期最近的工作日(周一至周五) | 0 0 15W * * 每月15号最近的工作日执行 |
# | 第几个 | 仅用于"周"字段,格式为"周几#第几个",表示某个月的第几个星期几 | 0 0 * * 3#2 每月的第2个星期三执行 |
特殊字符的组合使用可以构建出几乎任何时间粒度的调度规则。以下是一些组合使用的具体说明:
*/N 表示从0开始每N个单位执行一次。0 6,12,18 * * * 表示每天6:00、12:00、18:00执行。可以同时使用多个逗号分隔的值,如 0 0 1,15 * * 表示每月1日和15日执行。9-17 表示9点到17点(含两端)。连字符可以与逗号联合使用,如 0 9-12,14-17 * * *。起始值/步长。例如 0/15 在分钟字段中表示从0分钟开始每15分钟触发一次(即0、15、30、45分钟)。L 表示月份的最后一天(如1月的31日、2月的28或29日)。在"周"字段中,L 单独使用表示星期六(7),也可跟在数字后如 5L 表示最后一个星期四。15W:如果15日是周六则提前到周五(14日)执行,如果15日是周日则顺延到周一(16日)执行。周几#序号。例如 3#2 表示第2个星期三(3表示星期三,2表示第2个)。1#1 表示第1个星期一。以下列举了实际开发中最为常用的Cron表达式,覆盖了从高频到低频的各种调度场景:
| Cron表达式 | 含义 |
|---|---|
* * * * * | 每分钟执行一次(最频繁的调度) |
*/5 * * * * | 每5分钟执行一次 |
*/10 * * * * | 每10分钟执行一次 |
0 * * * * | 每小时整点执行(0分0秒时触发) |
0 9 * * * | 每天9:00执行 |
0 9 * * 1-5 | 工作日(周一至周五)9:00执行 |
*/10 8-18 * * * | 每天8:00到18:00之间,每10分钟执行一次 |
0 0 1 * * | 每月1日0:00执行 |
0 0 1 1 * | 每年1月1日0:00执行(年度任务) |
0 0,12 * * * | 每天0:00和12:00执行 |
0 9 * * 1,3,5 | 每周一、三、五的9:00执行 |
0 0 L * * | 每月最后一天0:00执行 |
0 9 15W * * | 每月15号最近的工作日9:00执行 |
0 0 * * 3#2 | 每月的第2个星期三0:00执行 |
在生产环境中合理使用Cron表达式,可以有效避免资源竞争和系统负载波动。以下是一些经过验证的最佳实践:
5 9 * * *(9:05)、10 9 * * *(9:10),错峰执行。23 9 * * * 代替 0 9 * * *),将任务分散到不同的分钟,减少资源竞争。0 9 * * *,任务B使用 15 9 * * *,任务C使用 30 9 * * *。0 3 * * *)。在Claude Code中使用Cron表达式调度定时任务时,需要注意以下与标准Cron实现的差异和特殊处理规则:
0 9 * * * 表示北京时间9:00触发。0 9 * * 1-5 # 北京时间工作日9:00执行