我正在使用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/