2017-05-30 157 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

相關問題