2013-01-14 68 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