我尝试了以下格式,当我阅读 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>
答案 0 :(得分:1)
您看到的是“默认”格式,例如当像 fmt.Println(ts)
一样打印时,这是 Time.String()
的结果。引用自 Time.String()
:
String 返回使用格式字符串格式化的时间
"2006-01-02 15:04:05.999999999 -0700 MST"
如您所见,它最后包含区域偏移量和区域名称。
另请注意,您使用了 time.Parse()
哪些文档:
在没有时区指示器的情况下,Parse 返回一个 UTC 时间。
解析带有 -0700 等时区偏移量的时间时,如果偏移量对应于当前位置(本地)使用的时区,则 Parse 在返回的时间中使用该位置和时区。否则,它会将时间记录为处于制造位置,时间固定在给定的区域偏移量。
由于在 Go Playground 上本地时间设置为 UTC
,其偏移量与您解析的时间的偏移量相匹配,因此将使用该区域,因此在 Go Playground 上打印它,您将看到 {{1 }}。
当您在本地(在您的计算机上)解析它并且本地时区不是 UTC 或另一个偏移量为 0 的区域时,根据文档,该位置将被记录为名称带有偏移量的虚构位置。< /p>
因此,当您在本地解析和打印该时间时,由于默认格式包括区域偏移量和区域名称,而且由于两者都是 UTC
,您会看到 +0000
打印了两次。< /p>
不用担心,解析的时间当然是正确的:
+0000
这在 Go Playground 上输出:
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"))
在本地(具有 2021-01-19 16:20:04 +0000 UTC
2021-01-19 16:20:04 +0000
2021-01-19 16:20:04 UTC
区域)输出:
CET
请注意,如果您要解析具有不同区域偏移量(不是 0)的时间,您也会在 Go Playground 上看到相同的情况。例如:
2021-01-19 16:20:04 +0000 +0000
2021-01-19 16:20:04 +0000
2021-01-19 16:20:04 +0000
这对我来说在 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"))
区域):
CET