- time.Date 构造出下一次任务执行的时间 next
- now.After(next) 判断 next 时间是否已经过去了,如果 true,已经过去了,则往后推一个循环,如果是每天的定时任务,则后推一天
- next.Sub(now) 计算下一次任务将在多少秒后执行
- 使用 time.NewTicker(duration) 构造一个定时器
- for 循环触发定时器,每次触发后再度初始化定时器
go
package main
import (
"fmt"
"time"
)
func main() {
// 每天的3点执行
hour := 3
minute := 0
second := 0
now := time.Now()
// 计算下一个3点时刻
next := time.Date(now.Year(), now.Month(), now.Day(), hour, minute, second, 0, now.Location())
if now.After(next) {
next = next.Add(24 * time.Hour)
}
duration := next.Sub(now)
fmt.Printf("下一次任务将在 %s 秒后执行", duration)
timer := time.NewTicker(duration)
defer timer.Stop()
// 定时调用
for {
select {
case <-timer.C:
fmt.Println("执行定时任务")
// 重新计算下一个3点时刻
now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day(), hour, minute, second, 0, now.Location())
next = next.Add(24 * time.Hour)
duration = next.Sub(now)
timer.Stop()
timer = time.NewTicker(duration)
fmt.Printf("下一次任务将在 %s 秒后执行", duration)
}
}
}