cron定时任务
cron定时任务
一、Cron表达式的定义
基础结构
Cron表达式是由空格分隔的6或7个字段组成的字符串,格式为:
秒 分 时 日 月 星期 [年]
其中,年通常可以被省略
字段说明:
-
秒(0-59)
秒字段表示每分钟的哪一秒执行任务。取值范围为0-59。
例如,如果要每分钟的第30秒执行任务,可以使用
30 * * * * ?
的格式。 -
分(0-59)
分字段表示每小时的哪一分钟执行任务。取值范围为0-59。
例如,如果要每小时的第15分钟执行任务,可以使用
* 15 * * * ?
的格式。 -
时(0-23)
时字段表示每天的哪一个小时执行任务。取值范围为0-23。
例如,如果要每天的凌晨2点执行任务,可以使用
* * 2 * * ?
的格式。 -
日(1-31)
日字段表示每月的哪一天执行任务。取值范围为1-31。
例如,如果要每月的第一天执行任务,可以使用
* * * 1 * ?
的格式。 -
月(1-12或JAN-DEC)
月字段表示每年的哪一个月执行任务。取值范围为
1-12
或用字符串JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
表示。例如,如果要每年的1月1日执行任务,可以使用
* * * 1 1 ?
的格式。 -
星期(0-6或SUN-SAT,0/7为周日)
周字段表示每周的哪一天执行任务。取值范围为0-6,也可以用字符串
SUN, MON, TUE, WED, THU, FRI, SAT
表示,其中0表示周日,1表示周一,以此类推。例如,如果要每周的周五执行任务,可以使用* * * * * 5 ?
的格式。
二、特殊字符
字符 | 含义 | 示例 |
---|---|---|
* | 表示所有取值范围内的值,可解读为 “每 | * * * * * * 每秒执行 |
? | 不指定值(仅用于日和星期冲突时) | 0 0 5 * ? 每天5点 |
- | 范围 | 0 9-17 * * * 9点到17点每小时 |
/ | 步长 | */5 * * * * 每5分钟 |
, | 枚举 | 0 0 8,12,18 * * 每天8/12/18点 |
L | 最后一天 | 0 0 L * * 每月最后一天 |
W | 最近工作日 | 0 0 15W * * 15日最近的工作日 |
# | 用于指定某个月份的第几个周几,只能作用于 “周” 上 | 0 0 * * 5#2 每月第2个周五 |
以下是Cron表达式中特殊字符的详细解析(基于2025年最新实践):
1、核心特殊字符
-
*
(通配符)- 匹配该字段所有有效值
- 示例:
0 * * * * ?
每分钟的0秒触发
-
?
(不指定)- 仅用于日和星期字段,解决两者冲突
- 示例:
0 0 12 1 * ?
每月1日中午执行(忽略星期)
-
/
(步长)- 表示时间间隔增量
- 示例:
0/15 * * * * ?
每15秒触发
2、范围与枚举
-
,
(枚举)- 指定多个离散值
- 示例:
0 0 8,12,18 * * ?
每天8/12/18点执行
-
-
(范围)- 定义连续时间段
- 示例:
0 0 9-17 * * MON-FRI
工作日9-17点每小时执行
3、高级逻辑字符
-
L
(最后一天)- 在日字段:
L
表示月末最后一天 - 在星期字段:
L
表示当月最后一个周日 - 示例:
0 0 12 L * ?
每月最后一天中午执行
- 在日字段:
-
W
(最近工作日)- 自动调整到最近的工作日(周一至周五)
- 示例:
0 0 12 15W * ?
每月15日最近的工作日执行
-
#
(第N个星期几)- 指定某月第N个特定星期
- 示例:
0 0 12 ? * 5#2
每月第二个周五中午执行
4、特殊组合
组合 | 说明 | 示例 |
---|---|---|
LW | 当月最后一个工作日 | 0 0 12 LW * ? |
L-3 | 月末倒数第3天 | 0 0 12 L-3 * ? |
5W | 5日最近的工作日 | 0 0 12 5W * ? |
三、预定义规则
1、核心预定义规则
-
基础周期规则
@yearly
或@annually
每年1月1日 00:00 执行(等效于0 0 1 1 *
)@monthly
每月1日 00:00 执行(等效于0 0 1 * *
)@weekly
每周日 00:00 执行(等效于0 0 * * 0
)@daily
或@midnight
每天 00:00 执行(等效于0 0 * * *
)@hourly
每小时整点执行(等效于0 * * * *
)
-
自定义间隔规则
@every <duration>
支持任意时间间隔(需符合time.ParseDuration
格式)
示例:@every 1h30m10s // 每1小时30分钟10秒 @every 5m // 每5分钟 @every 10s // 每10秒
2、特殊说明
-
执行逻辑差异
@every
的间隔从任务开始运行时计算(非自然时间对齐)
例如:@every 1h
若任务耗时3分钟,则下次执行在57分钟后
-
时区处理
预定义规则默认使用本地时区,可通过以下方式修改:// 方法1:全局设置时区 loc, _ := time.LoadLocation("Asia/Shanghai") c := cron.New(cron.WithLocation(loc))// 方法2:单任务指定时区 c.AddFunc("CRON_TZ=Asia/Tokyo @daily", task)
3、使用示例
package main
import ("fmt""github.com/robfig/cron/v3"
)
func main() {c := cron.New()// 添加预定义规则任务c.AddFunc("@hourly", func() { fmt.Println("每小时执行") })c.AddFunc("@every 30m", func() { fmt.Println("每30分钟执行") })c.Start()defer c.Stop()select{}
}