您看到的是“默认”格式,例如当像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 上打印它您会看到 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