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{}
}