猿问

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

我有一个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  // now

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

这就是为什么会得到错误的持续时间。如何为它们设置相同的时区?又是一个问题,注意第一次和第二次tik的持续时间相差5小时。为什么会出现这些问题。我究竟做错了什么?你有什么主意吗 ?让我高兴从你的任何提示?


Qyouu
浏览 149回答 2
2回答

PIPIONE

为避免 DST(夏令时)和其他错误,在持续时间内使用 UTC。例如,package mainimport (    "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 UTC2015-11-12 06:41:40.123409615 +0000 UTC2015-11-12 23:45:00 +0000 UTCduration: 17:3:00

森林海

peterSO 的回答是正确的。我用上面的代码解决了这个问题:endDate := time.Date(now.Year(), now.Month(), now.Day(), 23, 45, 0, now.Nanosecond(), now.Location())如果有人遇到这样的问题,他们可以选择其中一个。
随时随地看视频慕课网APP

相关分类

Go
我要回答