小编典典

去时间比较

go

我试图创建简单的功能,只是将一个时间的时区更改为另一个时区(假设UTC为+0700
WIB)。是源代码。我有2个函数,第GenerateWIB一个将具有相同日期时间的时区更改为+0700
WIB。其次是GenerateUTC将给定时间的时区更改为UTCGenerateUTC可以完美地工作,而另一个则不能。

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)
}

res != expect始终对这个结果fullfilled。

WIB Expect 2016-12-12 01:02:03.000000004 +0700 WIB, but get 2016-12-12 01:02:03.000000004 +0700 WIB

但这是同一时间吗?我错过了什么?


阅读 243

收藏
2020-07-02

共1个答案

小编典典

有一种.Equal()比较日期的方法:

if !res.Equal(expect) {
   ...

引用文档

请注意,Go
==运算符不仅会比较即时时间,还会比较“位置”和单调时钟读数。因此,在不首先确保已为所有值设置相同的“位置”(不可以通过使用UTC或“本地”方法实现)并且已将单调时钟读数剥离的情况下,不应将“时间”值用作映射或数据库键。设置t
= t.Round(0)通常,首选t.Equal(u)而不是t ==
u,因为t.Equal使用可用的最精确比较,并且仅当其参数之一具有单调时钟读数时才正确处理这种情况。

如果查看该time.Time结构的代码,则可以看到该结构具有三个私有字段:

type Time struct {
    ...
    wall uint64
    ext  int64

    ...
    loc *Location
}

关于这些字段的注释清楚地表明,根据Time构造的方式,两个Time描述相同时间点的字段可能具有不同的值。

运行res == expect比较这些内部字段的值,
运行res.Equal(expect)尝试做您期望的事情。

2020-07-02