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

Go:错误获取两次之间的差异

Go:错误获取两次之间的差异

Go
Qyouu 2021-11-22 15:38:15
我有一个headache时间。我有上面的代码:// ticker := time.NewTicker(time.Minute * 1)    ticker := time.NewTicker(time.Second * 1)    defer ticker.Stop()    // new version    for t := range ticker.C {        // get duration        go func() {            now := time.Now()            const layout = "2006-01-02 15:04:05"            endDateStr := fmt.Sprintf("%04d-%02d-%02d 23:45:00", now.Year(), now.Month(), now.Day())            endDate, _ := time.Parse(layout, endDateStr)            duration := endDate.Sub(now)            drHours := (duration.Minutes() - math.Mod(duration.Minutes(), 60)) / 60            drMinutes := math.Mod(duration.Minutes(), 60)            //fmt.Println(duration.Hours())            fmt.Println(now)            fmt.Println(endDate)            durStr := fmt.Sprintf("%d:%d:00", uint64(drHours), uint64(drMinutes))            fmt.Printf("duration: %s\n", durStr)        }()        fmt.Println(t)    }在我的compnow并且endDate有不同的时区:2015-11-12 10:33:53.9298552 +0500 UZT  // now2015-11-12 23:45:00 +0000 UTC          // endDate这就是为什么会得到错误的持续时间。如何为它们设置相同的时区?又是一个问题,注意第一次和第二次tik的持续时间相差5小时。为什么会出现这些问题。我究竟做错了什么?你有什么主意吗 ?让我高兴从你的任何提示?
查看完整描述

2 回答

?
PIPIONE

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

为避免 DST(夏令时)和其他错误,在持续时间内使用 UTC。例如,


package main


import (

    "fmt"

    "math"

    "time"

)


func main() {

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

    defer ticker.Stop()


    for t := range ticker.C {

        go func() {

            now := time.Now().UTC()


            const layout = "2006-01-02 15:04:05"

            endDateStr := fmt.Sprintf("%04d-%02d-%02d 23:45:00", now.Year(), now.Month(), now.Day())

            endDate, _ := time.Parse(layout, endDateStr)


            duration := endDate.Sub(now)

            drMinutes := math.Mod(duration.Minutes(), 60)

            drHours := (duration.Minutes() - drMinutes) / 60


            fmt.Println(now)

            fmt.Println(endDate)


            durStr := fmt.Sprintf("%d:%d:00", uint64(drHours), uint64(drMinutes))

            fmt.Printf("duration: %s\n", durStr)

        }()

        fmt.Println(t.UTC())

    }

}

输出:


2015-11-12 06:41:40.123232567 +0000 UTC

2015-11-12 06:41:40.123409615 +0000 UTC

2015-11-12 23:45:00 +0000 UTC

duration: 17:3:00


查看完整回答
反对 回复 2021-11-22
?
森林海

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

peterSO 的回答是正确的。我用上面的代码解决了这个问题:

endDate := time.Date(now.Year(), now.Month(), now.Day(), 23, 45, 0, now.Nanosecond(), now.Location())

如果有人遇到这样的问题,他们可以选择其中一个。


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

添加回答

举报

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