我试图创建简单的函数只是为了将时间的时区更改为另一个(让我们假设UTC到+0700 WIB)。 Here是源代码。我有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)
}
res != expect
总是满满的结果。
WIB Expect 2016-12-12 01:02:03.000000004 +0700 WIB, but get 2016-12-12 01:02:03.000000004 +0700 WIB
但是同时呢?我错过了什么吗?
答案 0 :(得分:3)
有一种.Equal()
方法来比较日期:
if !res.Equal(expect) {
...
引用the doc:
请注意,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)
尝试做你期望的事情。
答案 1 :(得分:1)
golang中的日期必须与Equal method进行比较。方法Date返回时间类型。
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
和时间类型有Equal method。
func (t Time) Equal(u Time) bool
Equal报告t和u是否代表同一时刻。即使它们位于不同的位置,两次也可以相等。例如,6:00 + 0200 CEST和4:00 UTC是相等的。有关使用== with Time值的陷阱,请参阅时间类型的文档;大多数代码应该使用Equal。
package main
import (
"fmt"
"time"
)
func main() {
secondsEastOfUTC := int((8 * time.Hour).Seconds())
beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
// Unlike the equal operator, Equal is aware that d1 and d2 are the
// same instant but in different time zones.
d1 := time.Date(2000, 2, 1, 12, 30, 0, 0, time.UTC)
d2 := time.Date(2000, 2, 1, 20, 30, 0, 0, beijing)
datesEqualUsingEqualOperator := d1 == d2
datesEqualUsingFunction := d1.Equal(d2)
fmt.Printf("datesEqualUsingEqualOperator = %v\n", datesEqualUsingEqualOperator)
fmt.Printf("datesEqualUsingFunction = %v\n", datesEqualUsingFunction)
}
datesEqualUsingEqualOperator = false
datesEqualUsingFunction = true