2017-02-17 63 views
2

我想時間從PST轉換爲UTC時區,但看到了一些意想不到的結果,時間UTC解析,同時IST爲UTC工作的罰款:PST在Golang

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 

    const longForm = "2006-01-02 15:04:05 MST" 
    t, err := time.Parse(longForm, "2016-01-17 20:04:05 IST") 
    fmt.Println(t, err) 
    fmt.Printf("IST to UTC: %v\n\n", t.UTC()) 

    s, err1 := time.Parse(longForm, "2016-01-17 23:04:05 PST") 
    fmt.Println(s, err1) 
    fmt.Printf("PST to UTC: %v\n\n", s.UTC()) 

} 

輸出是:

2016-01-17 20:04:05 +0530 IST <nil> 
IST to UTC: 2016-01-17 14:34:05 +0000 UTC 

2016-01-17 23:04:05 +0000 PST <nil> 
PST to UTC: 2016-01-17 23:04:05 +0000 UTC 

當解析爲IST完成,它示出了,而對於PST顯示和UTC其打印HH的相同值:MM:SS(23時04分05秒),如PST。我在這裏錯過了什麼?

+0

我不能重現此: https://play.golang.org/p/Oxn6863SQa – rofls

+0

這個錯誤還是我沒有以正確的方式使用API​​? – CodeQuestor

+0

在我的系統上,由於我的時區在IST中,因此IST的結果很好。但在golang服務器上,因爲這是UTC的默認設置,所以IST結果會變得糟糕。 – CodeQuestor

回答

3

time.Parse()文檔說:

如果區域縮寫是未知的,解析記錄時間與在給定的區域縮寫和零偏移量的製造位置中。這種選擇意味着這樣一個時間可以被無損地解析和重新格式化爲相同的佈局,但是在表示中使用的確切時刻會因實際的區域偏移而有所不同。爲避免出現此類問題,請使用使用數字區域偏移量的時間佈局,或使用ParseInLocation。

下面是如何使用ParseInLocation

IST, err := time.LoadLocation("Asia/Kolkata") 
if err != nil { 
    fmt.Println(err) 
    return 
} 
PST, err := time.LoadLocation("America/Los_Angeles") 
if err != nil { 
    fmt.Println(err) 
    return 
} 

const longForm = "2006-01-02 15:04:05 MST" 
t, err := time.ParseInLocation(longForm, "2016-01-17 20:04:05 IST", IST) 
fmt.Println(t, err) 
fmt.Printf("IST to UTC: %v\n\n", t.UTC()) 

s, err1 := time.ParseInLocation(longForm, "2016-01-17 23:04:05 PST", PST) 
fmt.Println(s, err1) 
fmt.Printf("PST to UTC: %v\n\n", s.UTC()) 

輸出:

2016-01-17 20:04:05 +0530 IST <nil> 
IST to UTC: 2016-01-17 14:34:05 +0000 UTC 

2016-01-17 23:04:05 -0800 PST <nil> 
PST to UTC: 2016-01-18 07:04:05 +0000 UTC 

Full code on the Go Playground

+0

除此之外,上面的代碼是否還會照顧PDT時區,比PST早1小時,或者我需要將時區從PST顯式轉換爲PDT,還是有任何直接從X時區轉換爲PDT的方法? – CodeQuestor

2

time.Parse()文檔說:

如果區域縮寫是未知的,解析記錄時間爲一個編造的位置給定區縮寫是和零點偏移。這種選擇意味着這樣一個時間可以被無損地解析和重新格式化爲相同的佈局,但是在表示中使用的確切時刻會因實際的區域偏移而有所不同。爲避免出現此類問題,請使用使用數字區域偏移量的時間佈局,或使用ParseInLocation。

因此,系統並不知道「PST」是什麼。對我而言,系統也不知道什麼是IST。您可以檢查支持的位置,像這樣:

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    for _, name := range []string{"MST", "UTC", "IST", "PST", "EST", "PT"} { 
     loc, err := time.LoadLocation(name) 
     if err != nil { 
      fmt.Println("No location", name) 
     } else { 
      fmt.Println("Location", name, "is", loc) 
     } 
    } 
} 

輸出我的系統上:

Location MST is MST 
Location UTC is UTC 
No location IST 
No location PST 
Location EST is EST 
No location PT