去:错误两次之间的差异

时间:2015-11-12 05:54:10

标签: datetime go timezone

我有一个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)
    }

在我的作品nowendDate有不同的时区:

2015-11-12 10:33:53.9298552 +0500 UZT  // now
2015-11-12 23:45:00 +0000 UTC          // endDate

这就是错误持续时间的原因。如何为它们设置相同的时区? 还有一个问题,当第一个和第二个持续时间相差5小时时,请注意。为什么会出现这些问题。我究竟做错了什么?你有什么主意吗 ?让我发现你的任何暗示?

2 个答案:

答案 0 :(得分:3)

为避免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

答案 1 :(得分:1)

peterSO's answer是对的。我用上面的代码解决了这个问题:

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

如果有人遇到类似的问题,他们可以选择其中的问题。