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

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

可用的代码段here:

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
}

我是否需要专门设置语言环境或其他内容?

最佳答案

Go中的时区解析并非总是能按预期进行。但是,由于时区缩写名称不明确,这一点非常重要。例如,您的情景中的EST是指澳大利亚东部标准时间(GMT + 11)还是东部标准时间(GMT-5)?

如果您的当地时间是“澳大利亚东部标准时间”,则Go会假设您的意思是当地时间。这就是为什么它可以在您的本地计算机上运行的原因。但是由于服务器未将其用作本地时间,因此没有理由假设您是指悉尼时间。取而代之的是,Go既不选择EST时区,也不创建假时间。名称为“EST”但UTC有效的位置。证明它最初是EST的唯一方法是调用t.Location().String()

时间包的作者here编写了一个错误报告,解释了时区解析的工作方式。

关于datetime - 将Go Time从UnixDate转换为RFC3339无法保存TimeZone,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14318193/

10-14 17:49