2012-12-30 20 views
10

Go Zeit druckt mitParse Go Zeitstempel Go mit

time.Now().String() 

als

2012-12-18 06:09:18.6155554 +0200 FLEST 

oder

2009-11-10 23:00:00 +0000 UTC 

http://play.golang.org/p/8qwq9U_Ri5

Wie kann ich es analysieren?

Ich denke FLEST ist Finland Latvian Estonian Standard Time Ich bin nicht in diesen Ländern und ich denke, ich kann alle Arten von Zeitzonen bekommen. Ich kann nicht eine einheitliche Art und Weise oder Muster finden, um es zu analysieren mit time.Parse

+0

Ich habe gedacht, dass es ein Fehler beim Gehen ist. Go enthält eine Datei 'lib/time/zoneinfo.zip', die viele Zeitzonen enthält, aber nicht FLEST. Aber dann frage ich mich, warum FLEST in erster Linie gedruckt wurde ... – topskip

+0

Mein Windows 7 PC druckt FLEST-Zeitzone in der Protokolldatei und der gleiche PC kann diese Zone nicht analysieren? – Max

Antwort

10
package main 

import (
"fmt" 
"time" 
) 

func main() { 
    fmt.Println(time.Now()) 
    date := "2009-11-10 23:00:00 +0000 UTC" 
    t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", date) 
     if err != nil { 
       fmt.Println("parse error", err.Error()) 
     } 
     fmt.Println(t.Format(time.ANSIC)) 
} 

Spielplatz: http://play.golang.org/p/hvqBgtesLd

Siehe den Quellcode bei http://golang.org/src/pkg/time/format.go?s=15404:15450#L607

+0

Es analysiert das zweite Datum, aber nicht das erste. http://play.golang.org/p/ekR_xIM2Pf – Max

+0

@Max du hast natürlich Recht. Es tut uns leid. – topskip

12

Obwohl time.Parse() einen Formatstring wie 2006-01-02 15:04:05 -0700 MST akzeptiert, es kann einfacher sein, einen der rechtzeitig definierten constants zu verwenden.

const (
    ANSIC  = "Mon Jan _2 15:04:05 2006" 
    UnixDate = "Mon Jan _2 15:04:05 MST 2006" 
    RubyDate = "Mon Jan 02 15:04:05 -0700 2006" 
    RFC822  = "02 Jan 06 15:04 MST" 
    RFC822Z  = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone 
    RFC850  = "Monday, 02-Jan-06 15:04:05 MST" 
    RFC1123  = "Mon, 02 Jan 2006 15:04:05 MST" 
    RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone 
    RFC3339  = "2006-01-02T15:04:05Z07:00" 
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00" 
    Kitchen  = "3:04PM" 
    // Handy time stamps. 
    Stamp  = "Jan _2 15:04:05" 
    StampMilli = "Jan _2 15:04:05.000" 
    StampMicro = "Jan _2 15:04:05.000000" 
    StampNano = "Jan _2 15:04:05.000000000" 
) 

Edit: Wenn Sie die Saiten als eine Möglichkeit verwenden zu speichern oder zu codieren Zeit (zB mit einem restriktiven Codierungsformat,) Sie Unix time mit berücksichtigen sollten. Auf diese Weise können Sie einfach eine int64 (oder zwei, wenn Sie die Anzahl der Nanosekunden beibehalten.

+0

Nichts funktioniert nicht zu parsen '" 2012-12-18 06: 09: 18.6155554 +0200 FLEST "' - 'parse error parsing time" 2012-12-18 06: 09: 18.6155554 +0200 FLEST "wie" 2006-01 -02 15:04:05 -0700 MST ":" FLEST "kann nicht als" MST "analysiert werden – Max

5

) Die Dokumentation für time.String gibt das Format, das es verwendet: "2006-01-02 15: 04: 05.999999999 -0700 MST ". Ein Anfang wäre, das gleiche Format für die Analyse zu verwenden.

Zeitzonen können ein Problem für Sie sein. Wenn Sie müssen Zeiten analysieren, von denen Sie wissen, dass sie mit time.String produziert wurden, aber in anderen Zeiten produziert wurden Zonen, Sie müssen die Zoneninfo für die anderen Zeitzonen haben.Weitere Informationen finden Sie in der Dokumentation unter LoadLocation.Wenn Sie die zoneinfo nicht erhalten können, nicht auf Ihrem System installieren können oder nicht riskieren können, in einer neuen unbekannten Zeitzone zu versagen, dann das time.String Format ist nicht für Sie, Sie müssen Zeitstempel in einem anderen Format erhalten oder die Zeit entfernen Zone aus den Strings und parsen die modifizierten Strings mit einem modifizierten Format.

+0

Es funktioniert nicht http://play.golang.org/p/xXJnS1dLIc – Max

+0

Es stellt sich heraus, dass es einen Fehler in 1.0 gibt .3, die jetzt an der Spitze fixiert ist, die das .999-Format vom Arbeiten behielt. Ihr Problem mit FLEST ist getrennt. Ich empfehle, dass Sie die Zeitzone vom Ende der Schnur entfernen, wie ich erwähnte. Wahrscheinlich würde ich den Fehler behandeln, indem ich in der Fehlernachricht nach dem Zonennamen "FLEST" suche, und wenn er gefunden wird, dann mit dem Zonennamen, der sowohl aus der Zeichenkette als auch dem Format entfernt wurde. – Sonia