首页 > 后端开发 > Golang > 为什么使用 == 运算符比较 Time.Time 实例会返回 False,即使它们表示相同的时间?

为什么使用 == 运算符比较 Time.Time 实例会返回 False,即使它们表示相同的时间?

DDD
发布: 2024-10-25 06:52:29
原创
320 人浏览过

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

进行时间比较

您正在尝试比较两个时间实例,但结果不是您所期望的。

您有两个函数Ge​​nerateWIB和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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板