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!