2013-01-14 37 views
1

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

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

代码片断可用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 
} 

我是否需要专门设置区域设置或什么?

回答

3

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

如果您当地的时间是“东部澳大利亚标准时间”,Go会假设您是指当地时间。这就是它在本地计算机上运行的原因。但由于服务器并未将其当作当地时间使用,因此没有理由假设您是指悉尼时间。相反,Go选择两个EST时区中的任意一个,并创建一个假名称为“EST”的时间位置,但是会产生UTC的影响。告诉它的唯一方法最初意味着是EST,将致电t.Location().String()

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

+0

谢谢,这似乎太容易成为真实:-)。所以我的直接解决方法是需要时间输入到UTC并将时区转换问题推送给我的客户。有没有更好的解决方法,通过设置位置/区域来消除时区缩写的歧义?您提到的线程没有描述解决方案。 – scaganoff