2017-05-30 155 views
-1

我期待这两个time.Time实例是一样的。但是,我不知道为什么我的比较结果是错误的。为什么这两个时间。UTC的时间实例和另一个位置的时间实例相同?

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”添加另一个代码片段。 UPDATE2:更新标题更精确(我希望这将有助于避免重复)

+2

从文档时间:'不要使用==与时间值'。您必须使用Equal方法 – JimB

+1

Location作为指针存储在time结构中,因此您将两个不同的指针值与Location结构进行比较,这就是它们不同的原因。 UTC恰好是使用零指针值的默认值,因此相等。这是一个实现细节,没有理由使用==与时间值,并且行为可能会随着使用单调时间的go1.9再次改变。 – JimB

+0

@JimB谢谢。你可以把它作为答案,以便我可以接受吗? –

回答

0

LoadLocation似乎每一次的指针返回到一个新的价值。

总之,要比较日期的方式是Equal

fmt.Println(dt2.Equal(dt)) 

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

相关问题