【发布时间】:2017-05-30 15:03:03
【问题描述】:
我希望这两个 time.Time 实例是相同的。但是,我不确定为什么我得到的比较结果是假的。
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))
}
如果我将"Asia/Yangon" 更改为"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”的代码 sn-p。 Update2:更新标题更准确(希望有助于避免重复)
【问题讨论】:
-
来自时间文档:
Do not use == with Time values。您必须使用 Equal 方法 -
位置作为指针存储在时间结构中,因此您将 2 个不同的指针值与位置结构进行比较,这就是它们不同的原因。 UTC 恰好是使用 nil 指针值的默认值,因此是相等的。这是一个实现细节,没有理由将 == 与时间值一起使用,并且使用单调时间的 go1.9 可能会再次改变行为。
-
@JimB 谢谢。你能把它作为答案让我接受吗?
标签: go