去时间比较

时间:2018-03-29 07:30:12

标签: datetime go

我试图创建简单的函数只是为了将时间的时区更改为另一个(让我们假设UTC到+0700 WIB)。 Here是源代码。我有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总是满满的结果。

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

但是同时呢?我错过了什么吗?

2 个答案:

答案 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

资源