Datetime 将Go Time从UnixDate转换为RFC3339无法保留时区

Datetime 将Go Time从UnixDate转换为RFC3339无法保留时区,datetime,go,Datetime,Go,我正在使用Go的时间包将UnixDate格式的时间字符串转换为rfc339格式的时间。这似乎很简单,在我的本地机器上运行良好,但在远程主机上运行时,时区信息似乎丢失了 输入时间是东澳大利亚标准时间(EST),似乎被time.Parse()解释为UTC 代码段可用: 我需要专门设置语言环境还是其他什么吗?Go中的时区解析并不总是像预期的那样工作。但这在很大程度上是由于时区缩写名称模棱两可。例如,您的情景中的EST是指澳大利亚东部标准时间(GMT+11)还是东部标准时间(GMT-5) 如果您的当地时

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

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

代码段可用:


我需要专门设置语言环境还是其他什么吗?

Go中的时区解析并不总是像预期的那样工作。但这在很大程度上是由于时区缩写名称模棱两可。例如,您的情景中的EST是指澳大利亚东部标准时间(GMT+11)还是东部标准时间(GMT-5)

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


时间包的作者写了一份错误报告,解释了时区解析是如何工作的。

谢谢,这看起来太容易了:-)。因此,我的直接解决办法是要求将时间输入UTC,并将时区转换问题推给我的客户。通过设置位置/区域设置来消除时区缩写的歧义,是否有更好的解决方案?您提到的线程没有描述解决方案。
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
}