2016-06-20 57 views
3

我從數據庫中提取時間戳,它使用RFC3339格式,但時區丟失。所以當我嘗試比較時間戳時,它會關閉。如何將dbtime更改爲東部時間?RFC3339在golang中分析時間

// time format 
const 
(
    RFC3339  = "2006-01-02T15:04:05Z07:00" 
) 

//now time 
now := time.Now() 
nowtime := now.Unix() 

fmt.Println("Nowtime:", nowtime) 
fmt.Println("Now:", now) 

//time in db 
fmt.Println("Dbtime string:", dbtime) 
udbtime, err := time.Parse.EST(RFC3339,dbtime) 
fmt.Println("RFC3339: " + RFC3339) 
fmt.Println("dbtime parsed", udbtime) 
fmt.Println("dbtime parsed unixtime", udbtime.Unix()) 

我的輸出

Nowtime: 1466443640 
Now: 2016-06-20 13:27:20.963232824 -0400 EDT 
Dbtime string: 2016-06-20T12:41:45.14Z 
RFC3339: 2006-01-02T15:04:05Z07:00 
dbtime parsed 2016-06-20 12:41:45.14 +0000 UTC 
dbtime parsed unixtime 1466426505 
+0

給你解析的dbtime的例子。 –

+0

時區不會丟失,時間2016-06-20T12:41:45.14Z'是UTC。 – JimB

+0

對不起原來的時間戳。 2016-06-20T12:41:45.14Z,但它實際上在美國東部時間。 –

回答

-1

如果你是100%肯定在數據庫中的時區是不正確,你可以將它像這樣

t2 := time.Date(
    t.Year(), 
    t.Month(), 
    t.Day(), 
    t.Hour(), 
    t.Minute(), 
    t.Second(), 
    t.Nanosecond(), 
    time.FixedZone("EDT", -4*60*60), 
) 
+2

恕我直言,最好是修正UTC的時間戳,即't.Add(-4 * time.Hour)',因爲時間戳通常被認爲是UTC。 – JimB

+0

這很好,很短。 –

0

你可以解析時間戳使用定義的time.RFC3339(如您所示),並在事實之後通過添加UTC偏移量來調整它們,以使它們在UTC中正確。

udbtime = udbtime.Add(4*time.Hour) 

然而,這需要檢查每個時間是否在EST或EDT添加標號正確的偏移量,除非你可以假設他們都是EDT。

更好的方法是使用自己的時間格式,而不需要特定的TZ偏移量(Z不是解析時間規範的一部分),並用time.ParseInLocation解析它。

這樣,您可以根據時間是否在EST或EDT中來計算正確的偏移量。

https://play.golang.org/p/IrUnTwvlkk

RFC3339local := "2006-01-02T15:04:05Z" 

loc, err := time.LoadLocation("America/New_York") 
if err != nil { 
    log.Fatal(err) 
} 

ts1 := "2016-06-20T12:41:45.14Z" 
t1, _ := time.ParseInLocation(RFC3339local, ts1, loc) 
fmt.Println(t1) 
// prints: 2016-06-20 12:41:45.14 -0400 EDT 

ts2 := "2016-01-20T12:41:45.14Z" 
t2, _ = time.ParseInLocation(RFC3339local, ts2, loc) 
fmt.Println(t2) 
// prints: 2016-01-20 12:41:45.14 -0500 EST