首頁  >  文章  >  後端開發  >  為什麼使用 == 運算子比較 Time.Time 實例會傳回 False,即使它們表示相同的時間?

為什麼使用 == 運算子比較 Time.Time 實例會傳回 False,即使它們表示相同的時間?

DDD
DDD原創
2024-10-25 06:52:29213瀏覽

Why Does Comparing Time.Time Instances Using the == Operator Return False Even If They Represent the Same Time?

進行時間比較

您正在嘗試比較兩個時間實例,但結果不是您所期望的。

您有兩個函數GenerateWIB和GenerateUTC 來更改給定時間的時區。 GenerateUTC 運作正常,而GenerateWIB 則不行。

比較兩個時間的程式碼是:

<code class="go">expect := time.Date(2016, 12, 12, 1, 2, 3, 4, wib)
t1 := time.Date(2016, 12, 12, 1, 2, 3, 4, time.UTC)
res := GenerateWIB(t1)
if res != expect {
    fmt.Printf("WIB Expect %+v, but get %+v", expect, res)
}</code>

此比較的結果總是 false,即使這兩個時間是相同。

問題是您正在使用 == 運算子來比較兩個 time.Time 實例。 == 運算子比較兩個結構體的所有欄位的值,包括 Location 欄位。

Location 欄位指定時間實例的時區。在您的情況下,expect 的時區為 wib,而 res 的時區為 UTC。這就是 == 運算子傳回 false 的原因。

要正確比較兩個 time.Time 實例,您應該使用 Equal 方法。 Equal 方法比較兩個結構體的 wall 和 ext 欄位的值,這些欄位表示時間點。 Equal 方法會忽略 Location 欄位。

以下是修正的程式碼:

<code class="go">expect := time.Date(2016, 12, 12, 1, 2, 3, 4, wib)
t1 := time.Date(2016, 12, 12, 1, 2, 3, 4, time.UTC)
res := GenerateWIB(t1)
if !res.Equal(expect) {
    fmt.Printf("WIB Expect %+v, but get %+v", expect, res)
}</code>

現在,比較的結果為 true,這是正確的結果。

注意

在比較兩個 time.Time 實例時,Equal 方法比 == 運算子更準確。 Equal 方法只考慮時間瞬間,而 == 運算子也考慮時區。

一般情況下,您應該使用 Equal 方法來比較兩個 time.Time 實例,除非您有特定原因使用 == 運算子。

以上是為什麼使用 == 運算子比較 Time.Time 實例會傳回 False,即使它們表示相同的時間?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn