如何将“2021-01-19T16:20:04+0000”解析为time.Time

时间:2021-01-19 18:34:30

标签: go time

我尝试了以下格式,当我阅读 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>

1 个答案:

答案 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