Go 为什么UTC的这两个时间实例相同,而另一个位置的这两个时间实例不同?

Go 为什么UTC的这两个时间实例相同,而另一个位置的这两个时间实例不同?,go,Go,我期待这两个时间。时间实例是相同的。但是,我不确定为什么我得到的比较结果是假的 package main import ( "fmt" "time" ) func main() { t := int64(1497029400000) locYangon, _ := time.LoadLocation("Asia/Yangon") dt := fromEpoch(t).In(locYangon) locYangon2, _ := time.L

我期待这两个
时间。时间
实例是相同的。但是,我不确定为什么我得到的比较结果是假的

package main

import (
    "fmt"
    "time"
)

func main() {
    t := int64(1497029400000)

    locYangon, _ := time.LoadLocation("Asia/Yangon")
    dt := fromEpoch(t).In(locYangon)

    locYangon2, _ := time.LoadLocation("Asia/Yangon")
    dt2 := fromEpoch(t).In(locYangon2)

    fmt.Println(dt2 == dt)
}

func fromEpoch(jsDate int64) time.Time {
    return time.Unix(0, jsDate*int64(time.Millisecond))
}

如果我将
“亚洲/仰光”
更改为
“UTC”
,它们是相同的

package main

import (
    "fmt"
    "time"
)

func main() {
    t := int64(1497029400000)

    locYangon, _ := time.LoadLocation("UTC")
    dt := fromEpoch(t).In(locYangon)

    locYangon2, _ := time.LoadLocation("UTC")
    dt2 := fromEpoch(t).In(locYangon2)

    fmt.Println(dt2 == dt)

}

func fromEpoch(jsDate int64) time.Time {
    return time.Unix(0, jsDate*int64(time.Millisecond))
}

注意:我知道
Equal
方法(事实上,我已使用
Equal
方法进行了修复)。但经过更多测试,我发现了一些有趣的案例,即“UTC”位置与“亚洲/仰光”位置。我期望两者都相等或不相等

更新:添加另一个带有“UTC”的代码段。
Update2:更精确地更新标题(我希望这有助于避免重复)

LoadLocation
似乎每次都返回指向新值的指针

无论如何,比较日期的好方法是
Equal

fmt.Println(dt2.Equal(dt))

操场:。

来自时间文档:
不要将==与时间值一起使用
。必须使用Equal方法,因为位置作为指针存储在时间结构中,所以要将两个不同的指针值与位置结构进行比较,这就是它们不同的原因。UTC恰好是使用nil指针值的默认值,因此是相等的。这是一个实现细节,没有理由将==与时间值一起使用,使用单调时间的go1.9可能会再次改变行为。@JimB谢谢。请把它作为答案,以便我能接受?相关/可能的副本