每小时完全按小时返回值的函数

时间:2017-12-14 12:37:09

标签: go

我试图创建一个函数,它会在每小时的时间内准确返回一个值。我下面的代码到目前为止,但是我能采取更好的方法吗?

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

2 个答案:

答案 0 :(得分:3)

您可以使用时间包AfterFunc功能。

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

它返回一个Timer,可用于使用Stop方法取消呼叫。第一次调用你可能需要计算到下一个小时的剩余时间,以便每次调用都在你想要的时间。

答案 1 :(得分:0)

如果您想以分钟/秒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
}