获取到自定时间的Durationgolang中的cron功能完整全面,但是如果只需要定时每天在某个时间点执行某任务,只需要如下简单实现。
import (
"testing"
"time"
)
//SetTime 获取到自定时间的Duration 误差在1s内
//计算设置时间和当前时间的差值,大于当前时间则返回,否则为第二天的时间
func SetTime(hour, min, second int) (d time.Duration) {
now := time.Now()
setTime := time.Date(now.Year(), now.Month(), now.Day(), hour, min, second, 0, now.Location())
d = setTime.Sub(now)
if d > 0 {
return
}
return d + time.Hour*24
}
使用示例
func ScheduleTask() {
// 每天7时0分触发更新
t := time.NewTimer(SetTime(7, 0, 0))
defer t.Stop()
for {
select {
case <-t.C:
t.Reset(time.Hour * 24)
// 定时任务函数
}
}
}
为了好理解,写了一个简单但是不够规范的测试
func TestSetTime(t *testing.T) {
now := time.Now()
// 比当前时间多几分钟 依然是当天的时间
d := SetTime(now.Hour(), now.Minute()+1, now.Second())
if time.Minute-d > time.Second {
t.Errorf("err taday target:%v get:%v", time.Hour, d)
} else {
t.Logf("taday target:%v get:%v", time.Hour, d)
}
// 第二天
d = SetTime(now.Hour()+24, now.Minute(), now.Second())
if time.Hour*24-d > time.Second {
t.Errorf("err tomorrow target:%v get:%v", time.Hour, d)
} else {
t.Logf("tomorrow target:%v get:%v", time.Hour, d)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)