Datetime 围棋时间比较
我试图创建一个简单的函数,将一个时间的时区更改为另一个(假设UTC为+0700WIB)。是源代码。我有两个函数,第一个是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
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)
}