2016-06-20 12 views
3

Ich ziehe einen Zeitstempel aus einer Datebase, es verwendet RFC3339-Format, aber die Zeitzone fehlt. Wenn ich versuche, die Zeitstempel zu vergleichen, wird es ausgeschaltet sein. Wie ändere ich dbtime, um Eastern Zeit zu sein?RFC3339 Zeitanalyse in 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()) 

Meine Ausgabe ist

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

ein Beispiel für die dbtime Geben Sie Parsen. –

+0

Die Zeitzone fehlt nicht, die Zeit "2016-06-20T12: 41: 45.14Z' ist UTC. – JimB

+0

Entschuldigung der ursprüngliche Zeitstempel. ist 2016-06-20T12: 41: 45.14Z, aber es ist tatsächlich in EDT. –

Antwort

-1

Wenn Sie 100% sicher, dass die Zeitzone in der Datenbank sind falsch ist, können Sie es wie diese umwandeln kann

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

IMHO, wäre es besser, die Zeitstempel in UTC, d. H. "T.Add (-4 * time.Hour)", zu fixieren, da Zeitstempel normalerweise als UTC angenommen werden. – JimB

+0

Das ist schön und kurz. –

0

Sie die Zeitstempel nicht analysieren Verwenden Sie die definierte time.RFC3339, wie Sie gezeigt haben, und passen Sie sie nachträglich an, indem Sie den UTC-Offset so addieren, dass sie in UTC korrekt sind.

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

jedoch Voraussetzung ist, dass Sie prüfen, ob jedes Mal in EST oder EDT fällt die richtige Offset hinzuzufügen, es sei denn Sie sie alle EDT sind annehmen können.

Eine bessere Möglichkeit wäre, Ihr eigenes Zeitformat ohne einen spezifischen TZ-Offset zu verwenden (das Z ist nicht Teil der Zeitspezifikation für das Parsing), und analysieren Sie es mit time.ParseInLocation.

Auf diese Weise können Sie den korrekten Offset berücksichtigen, je nachdem, ob die Zeit in EST oder EDT gewesen wäre.

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