为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕村225694 2021-11-15 20:44:13
我试图time.Ticker在偶数时间戳上开始。基本上我想要的是这段代码:package mainimport (    "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 MDTTime:  2015-10-21 12:53:55 -0600 MDT有没有优雅的解决方案?
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您可以延迟自动收报机的启动时间,使其接近 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()))


查看完整回答
反对 回复 2021-11-15
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

Ticker 将始终相对于您启动它的时间进行滴答。此外,如果您接收的速度不够快,可能会发生奇怪的事情。


我能立即想到的最好方法是计算下一个 5 秒间隔之前的持续时间,并用于time.After在那时获取信号。


const fiveSeconds = int64(5 * time.Second)

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

    // get current offset from 5 second interval.

    relativeTime := time.Now().UnixNano() % fiveSeconds

    // get remaining time in current 5 second interval.

    waitTime := fiveSeconds - relativeTime

    // wait that long

    ch := time.After(time.Duration(waitTime))

    <-ch

    fmt.Println(time.Now())

}

它可能与精确的 5 秒间隔有一点偏差,但如果你舍入它应该非常接近。


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信