您看到的是“默认”格式,例如当打印像fmt.Println(ts)
,这是结果Time.String() https://golang.org/pkg/time/#Time.String。引用自Time.String()
:
字符串返回使用格式字符串格式化的时间
"2006-01-02 15:04:05.999999999 -0700 MST"
正如你所看到的,它包含区域偏移量和区域名称到底。
另请注意,您使用了time.Parse() https://golang.org/pkg/time/#Parse其中记录了:
如果没有时区指示符,Parse 将返回 UTC 时间。
当解析具有像 -0700 这样的时区偏移量的时间时,如果该偏移量对应于当前位置(本地)使用的时区,则 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"))
这输出在去游乐场 https://play.golang.org/p/LwtxTUYdlXZ:
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"))
这两个输出都在去游乐场 https://play.golang.org/p/i4JCP8t2I8w对我来说是本地的(与CET
zone):
2021-01-19 16:20:04 +1100 +1100
2021-01-19 16:20:04 +1100
2021-01-19 16:20:04 +1100