前往时间对比

irv*_*ana 4 datetime go

我正在尝试创建简单的函数,只是为了将一个时间的时区更改为另一个时间(假设 UTC 为 +0700 WIB)。是源代码。我有 2 个函数,第一个GenerateWIB函数会将您的时区更改为具有相同日期时间的 +0700 WIB。第二个是GenerateUTC将给定时间的时区更改为UTC. GenerateUTC工作完美,而另一个则不然。

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)
}
Run Code Online (Sandbox Code Playgroud)

总是res != expect对这个结果感到满意。

WIB Expect 2016-12-12 01:02:03.000000004 +0700 WIB, but get 2016-12-12 01:02:03.000000004 +0700 WIB
Run Code Online (Sandbox Code Playgroud)

但时间是一样的吧?我错过了什么?

LeG*_*GEC 7

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

if !res.Equal(expect) {
   ...
Run Code Online (Sandbox Code Playgroud)

引用文档

请注意,Go == 运算符不仅比较时刻,还比较位置和单调时钟读数。因此,如果没有首先保证所有值都设置了相同的位置(这可以通过使用 UTC 或本地方法来实现),并且单调时钟读数已被剥离,则时间值不应用作地图或数据库键。设置 t = t.Round(0)。一般来说,更喜欢 t.Equal(u) 而不是 t == u,因为 t.Equal 使用最准确的可用比较,并正确处理只有其中一个参数具有单调时钟读数的情况。

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

type Time struct {
    ...
    wall uint64
    ext  int64

    ...
    loc *Location
}
Run Code Online (Sandbox Code Playgroud)

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

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


(*)截至 2020 年 10 月 27 日分支time/time.go上的源代码master