Datetime 围棋时间比较

Datetime 围棋时间比较,datetime,go,Datetime,Go,我试图创建一个简单的函数,将一个时间的时区更改为另一个(假设UTC为+0700WIB)。是源代码。我有两个函数,第一个是generateWeb,它只会将您的时区更改为+0700WIB,日期时间相同。第二个是GenerateUTC,它将给定时间的时区更改为UTCGenerateUTC工作正常,而另一个则不能 expect := time.Date(2016, 12, 12, 1, 2, 3, 4, wib) t1 := time.Date(2016, 12, 12, 1, 2, 3, 4, tim

我试图创建一个简单的函数,将一个时间的时区更改为另一个(假设UTC为+0700WIB)。是源代码。我有两个函数,第一个是
generateWeb
,它只会将您的时区更改为+0700WIB,日期时间相同。第二个是
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
但这是同一时间,对吗?我错过了什么吗?

有一种比较日期的方法:

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

引述:

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

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

type Time struct {
    ...
    wall uint64
    ext  int64

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

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



(*)
time/time.go
源代码于
master
分行,截止2020年10月27日

必须与golang的日期进行比较。方法返回时间类型

func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
时间类型有

Equal报告t和u是否代表同一时间瞬间。两次可以相等,即使它们位于不同的位置。例如,6:00+0200 CEST和4:00 UTC相等。有关使用==和时间值的陷阱,请参阅时间类型文档;大多数代码应该使用Equal

例子 datesEqualUsingEqualOperator=false

datesEqualUsingFunction=true

资源
func (t Time) Equal(u Time) bool
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)

}