2016-06-16 3 views
0

У меня есть время формата 2016-06-16 22:21:00 в XML-документе.Golang unmarshall mysql формат времени времени. Время

Я хочу разобрать время с Голаном.

type Price struct { 
    Instrument string `xml:"Instrument"` 
    Bid float32 `xml:"Bid"` 
    Ask float32 `xml:"Ask"` 
    Updated time.Time `xml:"Updated"` 
} 

type Prices []Price 

var p Prices 
err := xml.Unmarshal(body, &p) 
if err != nil { 
    log.Panicln(err) 
} 

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

panic: parsing time "2016-06-16 20:59:57" as "2006-01-02T15:04:05Z07:00": cannot parse " 20:59:57" as "T" 

Как распаковать в MySQL отформатированный DATETIME строку как time.Time?

Я прочитал, что мне нужно создать новое пользовательское время, которое реализует time.Time.

type customTime struct { 
    time.Time 
} 

func (c *customTime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 
    const shortForm = "2016-12-10 01:00:00" // yyyy-mm-dd hh:ii:ss date format 
    var v string 
    d.DecodeElement(&v, &start) 
    parse, err := time.Parse(shortForm, v) 
    if err != nil { 
     return err 
    } 
    *c = customTime{parse} 
    return nil 
} 

Но когда я это сделаю, я получаю следующее сообщение об ошибке.

panic: parsing time "2016-06-16 20:59:57": month out of range 
+0

Я считаю, что вы хотите 'const shortForm =" 2006-01-02 15:04:05 ". – smarx

+0

@smarx - Отличное спасибо. Я не понимаю, почему ваш «shortForm» работает, а у меня нет. Если вы напишете ответ с некоторым объяснением - я буду отмечать как правильный. – Gravy

ответ

1

Вы хотите const shortForm = "2006-01-02 15:04:05". Это немного странно, но способ time.Parse понимает, что форматы - это то, что вы должны дать в это конкретное время в качестве примера. Смотрите комментарий на https://golang.org/src/time/format.go:

// These are predefined layouts for use in Time.Format and Time.Parse. 
// The reference time used in the layouts is the specific time: 
// Mon Jan 2 15:04:05 MST 2006 
// which is Unix time 1136239445. Since MST is GMT-0700, 
// the reference time can be thought of as 
// 01/02 03:04:05PM '06 -0700 
// To define your own format, write down what the reference time would look 
// like formatted your way; see the values of constants like ANSIC, 
// StampMicro or Kitchen for examples. 

Вы, наверное, можете себе представить, почему это важно использовать предопределенные дату здесь ... например библиотека должна знать, имело ли значение значение 01/02 как 2 января или 1 февраля. Наличие предопределенной даты (умственно построенной, чтобы избежать повторных значений) неоднозначно.