如何将"2021-01-19T16:20:04+0000"解析为时间。时间



我尝试了以下格式,它应该在我读取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>

你看到的是"default"格式化,例如,当打印为fmt.Println(ts)时,这是Time.String()的结果。引用自Time.String():

String返回使用格式字符串

格式化的时间
"2006-01-02 15:04:05.999999999 -0700 MST"

可以看到,它包含区域偏移量和区域名称

还请注意,您使用了time.Parse(),它记录了:

在没有时区指示符的情况下,Parse返回UTC时间。

在解析具有-0700等区域偏移量的时间时,如果该偏移量对应于当前位置(Local)使用的时区,则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

相关内容

最新更新