ホームページ > バックエンド開発 > Golang > == 演算子を使用して Time.Time インスタンスを比較すると、同じ時間を表している場合でも false が返されるのはなぜですか?

== 演算子を使用して Time.Time インスタンスを比較すると、同じ時間を表している場合でも false が返されるのはなぜですか?

DDD
リリース: 2024-10-25 06:52:29
オリジナル
318 人が閲覧しました

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

時間比較に進みます

2 つの時間インスタンスを比較しようとしていますが、結果は期待したものではありません。

GenerateWIB という 2 つの関数があります。 GenerateUTC を使用して、特定の時刻のタイムゾーンを変更します。 GenerateUTC は完全に機能しますが、GenerateWIB は機能しません。

2 つの時間を比較するコードは次のとおりです。

<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>
ログイン後にコピー

この比較の結果は、2 つの時間が同じであっても、常に false になります。

問題は、== 演算子を使用して 2 つの time.Time インスタンスを比較していることです。 == 演算子は、Location フィールドを含む 2 つの構造体のすべてのフィールドの値を比較します。

Location フィールドは、タイム インスタンスのタイム ゾーンを指定します。あなたの場合、expectのタイムゾーンはwibですが、resのタイムゾーンはUTCです。 == 演算子が false を返すのはこのためです。

2 つの time.Time インスタンスを正しく比較するには、Equal メソッドを使用する必要があります。 Equal メソッドは、時刻を表す 2 つの構造体の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 になり、これが正しい結果です。

2 つの time.Time インスタンスを比較する場合、Equal メソッドは == 演算子よりも正確です。 Equal メソッドは時刻のみを考慮しますが、== 演算子はタイム ゾーンも考慮します。

一般に、特別な理由がない限り、2 つの time.Time インスタンスを比較するには Equal メソッドを使用する必要があります。 == 演算子を使用します。

以上が== 演算子を使用して Time.Time インスタンスを比較すると、同じ時間を表している場合でも false が返されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート