【问题标题】:Why these two time.Time instances are same for UTC and different for another location?为什么这两个 time.Time 实例对于 UTC 是相同的,而对于另一个位置是不同的?
【发布时间】: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))
}

Playground

如果我将"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))
}

Playground

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

更新:添加另一个带有“UTC”的代码 sn-p。 Update2:更新标题更准确(希望有助于避免重复)

【问题讨论】:

  • 来自时间文档:Do not use == with Time values。您必须使用 Equal 方法
  • 位置作为指针存储在时间结构中,因此您将 2 个不同的指针值与位置结构进行比较,这就是它们不同的原因。 UTC 恰好是使用 nil 指针值的默认值,因此是相等的。这是一个实现细节,没有理由将 == 与时间值一起使用,并且使用单调时间的 go1.9 可能会再次改变行为。
  • @JimB 谢谢。你能把它作为答案让我接受吗?

标签: go


【解决方案1】:

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

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

fmt.Println(dt2.Equal(dt))

游乐场:https://play.golang.org/p/9GW-LSF0wg

【讨论】:

    猜你喜欢
    • 2018-03-17
    • 2021-04-17
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2019-08-07
    相关资源
    最近更新 更多