每小时精确地返回一个小时值的函数



我正在尝试创建一个函数,该函数将每小时准确地返回一个小时值。它下面的代码是我到目前为止所拥有的,但是我可以采取更好的方法吗?

func main() {
for {
t := time.Now()
if t.Minute() == 00 {
fmt.Println("Hello World!")
}
time.Sleep(1 * time.Minute)
}
}

您可以使用时间包 AfterFunc 函数。

time.AfterFunc(time.Hour * 1, func() {
// Do something!
})

它返回一个计时器,可用于使用其 Stop 方法取消调用。第一次调用时,您可能必须计算到下一个小时的剩余时间,以便每次调用都按时间进行。

如果你想准确地在分钟/秒0开始动作,那么在 Go 中截断到一个小时有点棘手。

而且时间每次都会移动一点,因为所有关于时间的保证至少都有条件(例如time.Sleep(d)至少在一段时间内休眠d而不是完全d)。

根据这些要求,此代码将执行以下任务:

func main() {
timer := time.NewTimer(nextDelay())
for {
<-timer.C
timer.Reset(nextDelay())
time.Sleep(time.Minute * 59) // the task, or you could do more tricks with channels
}
}
func nextDelay() time.Duration {
now := time.Now()
return truncateHour(now).Add(time.Hour).Sub(now)
}
func truncateHour(t time.Time) time.Time {
t = t.Truncate(time.Minute * 30)
if t.Minute() > 0 {
t = t.Add(time.Minute * -1).Truncate(time.Minute * 30)
}
return t
}

(在围棋操场上)

最新更新