2016-06-13 5 views
5

Ich versuche, ein einfaches Tool, das JSON-formatierte Zeilen in einer Datei analysiert und führt eine INSERT Operation in eine Datenbank.Vollständig Parsing Timestamps in Golang

Ich habe eine Struktur, die wie folgt aussieht:

type DataBlob struct { 
    .... 
    Datetime time.Time `json:"datetime, string"` 
    .... 
} 

Und Code Parsen, die wie folgt aussieht:

scanner := bufio.NewScanner(file) 
// Loop through all lines in the file 
for scanner.Scan() { 
    var t DataBlob 

    // Decode the line, parse the JSON 
    dec := json.NewDecoder(strings.NewReader(scanner.Text())) 
    if err := dec.Decode(&t); 
    err != nil { 
     panic(err) 
    } 

    // Perform the database operation 
    executionString: = "INSERT INTO observations (datetime) VALUES ($1)" 
    _, err := db.Exec(executionString, t.Datetime) 
    if err != nil { 
     panic(err) 
    } 
} 

Meine JSON-Datei hat Linien, die jeweils einen datetime Wert, der wie folgt aussieht :

{ "datetime": 1465793854 } 

Wenn der formatiert ist als UNIX Zeitpunkt wirft die Marshaller:

panic: parsing time "1465793854" as ""2006-01-02T15:04:05Z07:00"": cannot parse "1465793854" as """ 

In dem Skript, das die JSON (auch geschrieben in Golang) erzeugt habe ich versucht, einfach die Stringdarstellung des Typs Time.time Drucken, das folgende:

{ "datetime": "2016-06-13 00:23:34 -0400 EDT" } 

, auf die die Marshaller beschwert, wenn ich es analysieren gehen zu:

panic: parsing time ""2016-06-13 00:23:34 -0400 EDT"" as ""2006-01-02T15:04:05Z07:00"": cannot parse " 00:23:34 -0400 EDT"" as "T" 

Wenn ich diesen Zeitstempel auch behandeln als String und vermeiden das Marshalling Problem (was ziemlich normal aussieht), klagt Postgres, wenn ich versuche, die Einfügung auszuführen:

panic: pq: invalid input syntax for type timestamp: "2016-06-13 00:23:34 -0400 EDT" 

Dies ist auf mehreren Ebenen frustrierend, vor allem aber weil, wenn ich einen Time.time Typ serialisieren würde, würde ich denken, dass es noch auf der anderen Seite des Prozesses verstanden werden sollte.

Wie kann ich diesen Zeitstempel analysieren, um die Datenbankeinfügung durchzuführen? Entschuldigt sich für die lange Frage und danke für Ihre Hilfe!

Antwort

6

JSON-Unmarshalling von time.Timeexpects Datumszeichenkette im RFC 3339-Format zu sein.

Also in Ihrem Golang-Programm, das JSON generiert, anstatt nur time.Time Wert zu drucken, verwenden Sie Format, um es im RFC 3339-Format zu drucken.

t.Format(time.RFC3339) 

, wenn ich einen time.time Typen serialisiert, würde ich denke, es ist immer noch auf der anderen Seite des Prozesses verstanden werden sollte,

Wenn Sie die Marshaller interface mit der Serialisierung verwendet, es würde das Datum tatsächlich im RFC 3339-Format ausgeben. Also wird die andere Seite des Prozesses es verstehen. Sie können das auch tun.

d := DataBlob{Datetime: t} 
enc := json.NewEncoder(fileWriter) 
enc.Encode(d)