【问题标题】:How to parse "2021-01-19T16:20:04+0000" as time.Time如何将“2021-01-19T16:20:04+0000”解析为 time.Time
【发布时间】:2021-01-19 18:34:30
【问题描述】:

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

【问题讨论】:

  • 我复制并粘贴了您的示例字符串和格式字符串,它在操场上按预期工作,如果它不适合您,请显示完整代码以重现该问题。 play.golang.org/p/wHBYz7iKnLT
  • 你两次称它为“奇怪”——到底有什么奇怪的地方?
  • 在我看来像是双时区,但@icza 解释得很好

标签: go time


【解决方案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 上打印它您会看到 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2021-06-23
    • 2012-03-03
    • 2014-09-19
    • 2021-11-25
    • 2020-01-21
    • 1970-01-01
    相关资源
    最近更新 更多