Golang time.Ticker,如何从偶数时间戳开始

我试图time.Ticker在偶数时间戳上开始。基本上我想要的是这段代码:


package main


import (

    "fmt"

    "time"

)


func main() {

    ticker := time.NewTicker(time.Second * 5)


    for i := 0; i < 2; i++ {

        select {

        case <-ticker.C:

            fmt.Println("Time: ", time.Now().Round(time.Second*1))

        }

    }


    ticker.Stop()

}

要始终以偶数 5 秒的间隔打印:


Time:  2015-10-21 12:53:50 -0600 MDT

Time:  2015-10-21 12:53:55 -0600 MDT

有没有优雅的解决方案?


慕村225694
浏览 186回答 2
2回答

慕码人2483693

您可以延迟自动收报机的启动时间,使其接近 5 秒:fiveSec := int64(5 * time.Second)time.Sleep(time.Duration(fiveSec - (time.Now().UnixNano() % fiveSec)))ticker := time.NewTicker(time.Second * 5)或者使用 Time 方法获得正确延迟的另一种方法:time.Sleep(time.Now().Truncate(5 * time.Second).Add(5 * time.Second).Sub(time.Now()))

慕尼黑5688855

Ticker 将始终相对于您启动它的时间进行滴答。此外,如果您接收的速度不够快,可能会发生奇怪的事情。我能立即想到的最好方法是计算下一个 5 秒间隔之前的持续时间,并用于time.After在那时获取信号。const fiveSeconds = int64(5 * time.Second)for i := 0; i < 2; i++ {&nbsp; &nbsp; // get current offset from 5 second interval.&nbsp; &nbsp; relativeTime := time.Now().UnixNano() % fiveSeconds&nbsp; &nbsp; // get remaining time in current 5 second interval.&nbsp; &nbsp; waitTime := fiveSeconds - relativeTime&nbsp; &nbsp; // wait that long&nbsp; &nbsp; ch := time.After(time.Duration(waitTime))&nbsp; &nbsp; <-ch&nbsp; &nbsp; fmt.Println(time.Now())}它可能与精确的 5 秒间隔有一点偏差,但如果你舍入它应该非常接近。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go