我尝试了以下格式,它应该在我读取https://golang.org/pkg/time/#pkg-constants:时捕获+0000
时区偏移量
ts, err := time.Parse("2006-01-02T15:04:05-0700", "2021-01-19T16:20:04+0000")
但是当输出结果列表(没有错误)时,这看起来相当奇怪:
2021-01-19 16:47:00 +0000 +0000
在本地运行https://play.golang.org/p/wHBYz7iKnLT (OSX 11.1)会得到奇怪的结果:
❯ gor time.go
2021-01-19 16:20:04 +0000 +0000 <nil>
你看到的是"default"格式化,例如,当打印为fmt.Println(ts)
时,这是Time.String()
的结果。引用自Time.String()
:
String返回使用格式字符串
格式化的时间"2006-01-02 15:04:05.999999999 -0700 MST"
可以看到,它包含区域偏移量和区域名称
还请注意,您使用了time.Parse()
,它记录了:
在没有时区指示符的情况下,Parse返回UTC时间。
在解析具有-0700等区域偏移量的时间时,如果该偏移量对应于当前位置(Local)使用的时区,则Parse在返回的时间中使用该位置和区域。否则,它将时间记录为在一个预制位置,时间固定在给定的区域偏移。
由于在Go Playground上,本地时间被设置为UTC
,其偏移量与您解析的时间偏移量相匹配,因此将使用该区域,因此在Go Playground上打印它,您将看到UTC
。
当您在本地(在您的计算机上)解析它时,如果本地时区不是UTC或其他具有0偏移量的区域,则根据文档,该位置被记录为具有偏移量的名称的虚构位置。
因此,当您在本地解析和打印该时间时,由于默认格式包括区域偏移量和区域名称,并且都是+0000
,因此您将看到+0000
打印两次。
不用担心,解析的时间当然是正确的:
ts, err := time.Parse("2006-01-02T15:04:05-0700", "2021-01-19T16:20:04+0000")
if err != nil {
panic(err)
}
fmt.Println(ts)
fmt.Println(ts.Format("2006-01-02 16:04:05 -0700"))
fmt.Println(ts.Format("2006-01-02 16:04:05 MST"))
在Go Playground上输出:
2021-01-19 16:20:04 +0000 UTC
2021-01-19 16:20:04 +0000
2021-01-19 16:20:04 UTC
本地(具有CET
区域)输出:
2021-01-19 16:20:04 +0000 +0000
2021-01-19 16:20:04 +0000
2021-01-19 16:20:04 +0000
请注意,如果您用不同的区域偏移量(不是0)解析时间,您也会在Go Playground上看到相同的内容。例如:
ts, err := time.Parse("2006-01-02T15:04:05-0700", "2021-01-19T16:20:04+1100")
if err != nil {
panic(err)
}
fmt.Println(ts)
fmt.Println(ts.Format("2006-01-02 16:04:05 -0700"))
fmt.Println(ts.Format("2006-01-02 16:04:05 MST"))
这在Go Playground和本地为我(与CET
区域)输出:
2021-01-19 16:20:04 +1100 +1100
2021-01-19 16:20:04 +1100
2021-01-19 16:20:04 +1100