引用包: "github.com/robfig/cron/v3"
1. 基本使用
1.1 初始化实例 new()
| func New(opts ...Option) *Cron |
1.2 添加定时任务 AddFunc()
| func (c *Cron) AddFunc(spec string, cmd func()) (EntryID, error) |
| c.AddFunc("* * * * *", func() { fmt.Println("====== 招募完成: 士兵 +1 =======") }) |
1.3 开始定时任务 Start()
1.4 完整示例
| package main |
| |
| import ( |
| "fmt" |
| "github.com/robfig/cron/v3" |
| "time" |
| ) |
| |
| func main() { |
| |
| c := cron.New() |
| c.Start() |
| fmt.Println(time.Now()) |
| c.AddFunc("* * * * *", func() { fmt.Println(time.Now(),"====== 招募完成: 士兵 +1 =======") }) |
| c.AddFunc("*/5 * * * *", func() { fmt.Println(time.Now(),"====== 招募完成: 伍长 +1 =======") }) |
| select {} |
| } |
| 2022-12-16 16:40:32.155401624 +0800 CST m=+0.000051359 |
| 2022-12-16 16:41:00.012072936 +0800 CST m=+27.856722654 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 16:42:00.061328164 +0800 CST m=+87.905977883 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 16:43:00.003474685 +0800 CST m=+147.848124410 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 16:44:00.059798048 +0800 CST m=+207.904447766 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 16:45:00.06000457 +0800 CST m=+267.904654288 ====== 招募完成: 伍长 +1 ======= |
| 2022-12-16 16:45:00.060084718 +0800 CST m=+267.904734436 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 16:46:00.042836167 +0800 CST m=+327.887485885 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 16:47:00.000225283 +0800 CST m=+387.844875007 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 16:48:00.000241943 +0800 CST m=+447.844891661 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 16:49:00.040677982 +0800 CST m=+507.885327700 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 16:50:00.00034055 +0800 CST m=+567.844990268 ====== 招募完成: 伍长 +1 ======= |
1.5 第一次执行定时任务的契机
如上可见,定时任务第一次执行的时候是程序开始的第一个契机:
- 16:40:32 程序开始执行。
- 16:41:00 是一个整分钟,每分钟招募士兵开始执行。
- 16:45:00 是开始后,第一个整五分钟,因此五分钟执行一次的招募伍长开始执行。
1.6 spec 的设置
五个值分别为:
| * * * * * |
| 00 */3 * * * |
| 10 03 * * * |
| 00 02 * * 7 |
| 00 02 14 2 7 |
| 00 02 2,5,8 * * |
| 00 02 1-8 * * |
2. 粒度到秒
2.1 语法示例
| c := cron.New(cron.WithSeconds()) |
最左一位是秒,其他和之前分钟粒度相同。
2.2 完整示例
| package main |
| |
| import ( |
| "fmt" |
| "github.com/robfig/cron/v3" |
| "time" |
| ) |
| |
| func main() { |
| c := cron.New(cron.WithSeconds()) |
| fmt.Println(time.Now()) |
| |
| c.AddFunc("*/7 * * * * *", func() { fmt.Println(time.Now(),"====== 建造完成: 投石车 +1 =======") }) |
| c.AddFunc("*/3 * * * * *", func() { fmt.Println(time.Now(),"====== 招募完成: 士兵 +1 =======") }) |
| c.Start() |
| select {} |
| } |
| 2022-12-16 17:29:26.672306792 +0800 CST m=+0.000036478 |
| 2022-12-16 17:29:27.001131052 +0800 CST m=+0.328860748 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 17:29:28.000333997 +0800 CST m=+1.328063678 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-16 17:29:30.000180946 +0800 CST m=+3.327910638 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 17:29:33.002458758 +0800 CST m=+6.330188430 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 17:29:35.000249936 +0800 CST m=+8.327979610 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-16 17:29:36.000311745 +0800 CST m=+9.328041418 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 17:29:39.002463183 +0800 CST m=+12.330192861 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 17:29:42.000297949 +0800 CST m=+15.328027640 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-16 17:29:42.000353037 +0800 CST m=+15.328082842 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 17:29:45.00024908 +0800 CST m=+18.327978755 ====== 招募完成: 士兵 +1 ======= |
| 2022-12-16 17:29:48.002469543 +0800 CST m=+21.330199229 ====== 招募完成: 士兵 +1 ======= |
| |
如上可见:
- 17:29:26 程序开始执行
- 17:29:27 ,27秒是第一个3秒的整倍数,每隔3秒 招募一个士兵的任务开始执行
- 17:29:35,35秒是第一个7秒的整倍数,每隔7秒 建造一个投石车的任务开始执行。
3. 按时间间隔
3.1 语法
符号 |
说明 |
示例 |
@yearly |
每年执行 |
|
@monthly |
每月执行 |
|
@weekly |
每周执行 |
|
@daily |
每天执行 |
|
@hourly |
每小时执行 |
|
@every |
指定间隔 |
"@every 1h15m" |
3.2 完整示例(@every)
| package main |
| |
| import ( |
| "fmt" |
| "github.com/robfig/cron/v3" |
| "time" |
| ) |
| |
| func main() { |
| c := cron.New(cron.WithSeconds()) |
| fmt.Println(time.Now()) |
| |
| c.AddFunc("@every 1m", func() { fmt.Println(time.Now(),"====== 建造完成: 投石车 +1 =======") }) |
| c.Start() |
| select {} |
| |
| } |
如下可见,和前文“基本使用”中示例的执行契机不同。会在程序启动后一分钟执行,而不是在下一个一分钟的整倍数执行。
- 程序在09:53:11启动,在一分钟之后(09:54:11)执行第一次
- 如果是基本使用中的方法:程序在09:53:11启动,会在09:54:00 执行第一次
| 2022-12-21 09:53:11.620438535 +0800 CST m=+0.000041561 |
| 2022-12-21 09:54:11.008589266 +0800 CST m=+59.388192276 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-21 09:55:11.052366134 +0800 CST m=+119.431969148 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-21 09:56:11.008584381 +0800 CST m=+179.388187390 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-21 09:57:11.018895862 +0800 CST m=+239.398498872 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-21 09:58:11.018836287 +0800 CST m=+299.398439302 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-21 09:59:11.008604569 +0800 CST m=+359.388207580 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-21 10:00:11.006091578 +0800 CST m=+419.385694593 ====== 建造完成: 投石车 +1 ======= |
| 2022-12-21 10:01:11.010293781 +0800 CST m=+479.389896790 ====== 建造完成: 投石车 +1 ======= |
3.3 完整示例
| package main |
| |
| import ( |
| "fmt" |
| "github.com/robfig/cron/v3" |
| "time" |
| ) |
| |
| func main() { |
| c := cron.New(cron.WithSeconds()) |
| fmt.Println(time.Now()) |
| |
| c.AddFunc("@weekly", func() { fmt.Println(time.Now(),"====== 建造完成: 投石车 +1 =======") }) |
| c.Start() |
| select {} |
| |
| } |
时间太长等不来了

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了