2016-06-13 6 views
5

Я пытаюсь сделать простой инструмент, который анализирует строки в формате JSON в файле и выполняет операцию INSERT в базе данных.Полностью Parsing Timestamps в Golang

У меня есть-структуру, которая выглядит следующим образом:

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

и разбора кода, который выглядит следующим образом:

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) 
    } 
} 

Мой файл JSON имеет линии, каждая из которых содержит значение datetime который выглядит следующим образом :

{ "datetime": 1465793854 } 

При форматировании datetime как метку времени Unix, то ИАС жалуется:

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

В сценарии, который генерирует JSON (также написанный в Golang), я попытался просто напечатать строковое представление Time.time типа, производя следующее:

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

на что ИАС жалуется, когда я иду, чтобы разобрать его:

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" 

Если я также рассматривать эту временную метку (которая выглядит довольно стандартный) в виде строки и избежать проблем Маршалинга, Postgres жалуется, когда я пытаюсь выполнить вставку:

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

Это расстраивает на несколько уровней, но в основном потому что если я сериализую тип Time.time, я бы подумал, что его следует понимать на другой стороне процесса.

Как я могу разобрать эту метку времени для выполнения ввода базы данных? Извиняется за длинный вопрос и спасибо за вашу помощь!

ответ

6

JSON unmarshalling of time.Timeexpects дата строка должна быть в формате RFC 3339.

Итак, в вашей программе golang, которая генерирует JSON, вместо того, чтобы просто печатать значение time.Time, используйте Format для печати в формате RFC 3339.

t.Format(time.RFC3339) 

если я сериализовать тип Time.time, я думаю, что он должен еще быть понял на другой стороне процесса

Если вы использовали Marshaller interface с сериализации, его действительно выводит дату в формате RFC 3339. Так что другая сторона процесса поймет это. Поэтому вы тоже можете это сделать.

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