我试图创建简单的功能,只是将一个时间的时区更改为另一个时区(假设UTC为+0700 WIB)。这是源代码。我有2个函数,第GenerateWIB一个将具有相同日期时间的时区更改为+0700 WIB。其次是GenerateUTC将给定时间的时区更改为UTC。GenerateUTC可以完美地工作,而另一个则不能。
GenerateWIB
GenerateUTC
UTC
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。
res != expect
WIB Expect 2016-12-12 01:02:03.000000004 +0700 WIB, but get 2016-12-12 01:02:03.000000004 +0700 WIB
但这是同一时间吗?我错过了什么?
有一种.Equal()比较日期的方法:
.Equal()
if !res.Equal(expect) { ...
引用文档:
请注意,Go ==运算符不仅会比较即时时间,还会比较“位置”和单调时钟读数。因此,在不首先确保已为所有值设置相同的“位置”(不可以通过使用UTC或“本地”方法实现)并且已将单调时钟读数剥离的情况下,不应将“时间”值用作映射或数据库键。设置t = t.Round(0)通常,首选t.Equal(u)而不是t == u,因为t.Equal使用可用的最精确比较,并且仅当其参数之一具有单调时钟读数时才正确处理这种情况。
如果查看该time.Time结构的代码,则可以看到该结构具有三个私有字段:
time.Time
type Time struct { ... wall uint64 ext int64 ... loc *Location }
关于这些字段的注释清楚地表明,根据Time构造的方式,两个Time描述相同时间点的字段可能具有不同的值。
Time
运行res == expect比较这些内部字段的值, 运行res.Equal(expect)尝试做您期望的事情。
res == expect
res.Equal(expect)