1

我正在使用 Go 的时间包将UnixDate格式化的时间字符串转换为格式化的时间。RFC3339这似乎很容易并且在我的本地机器上运行良好,但是当在远程主机上运行时,时区信息似乎丢失了。

输入时间是澳大利亚东部标准时间 (EST),似乎被解释为 UTC time.Parse()

此处提供的代码段:

package main

import "fmt"
import "time"

func main() {
    t,_ := time.Parse(time.UnixDate,"Mon Jan 14 21:50:45 EST 2013")
    fmt.Println(t.Format(time.RFC3339))  // prints time as Z

    t2,_:=time.Parse(time.RFC3339,t.Format(time.RFC3339))
    fmt.Println(t2.Format(time.UnixDate)) // prints time as UTC
}

我需要专门设置语言环境或其他任何东西吗?

4

1 回答 1

3

Go 中的时区解析并不总是按预期工作。但这很重要,因为时区缩写名称不明确。例如,您方案中的 EST 是指澳大利亚东部标准时间 (GMT+11) 还是东部标准时间 (GMT-5)?

如果您的当地时间是“澳大利亚东部标准时间”,Go 将假定您指的是当地时间。这就是它在您的本地计算机上工作的原因。但是由于服务器没有将其用作当地时间,因此没有理由假设您的意思是悉尼时间。相反,Go 不选择任何 EST 时区并创建一个名为“EST”但效果为 UTC 的假 time.Location。告诉它最初是 EST 的唯一方法是调用t.Location().String().

time 包的作者写了一个错误报告来解释时区解析是如何工作

于 2013-01-14T13:48:35.373 回答