Golang XML Unmarshal и time.Time поля

У меня есть XML-данные, которые я извлекаю с помощью REST API, что я не привязываю к структуре GO. Одним из полей является поле даты, однако формат даты, возвращаемый API, не соответствует формату времени по умолчанию. Формат времени синтаксиса и, следовательно, немаршал не работает.

Можно ли указать функцию unmarshal, формат даты которой будет использоваться в time.Time parsing? Я хотел бы использовать правильно определенные типы, и использование строки для хранения поля datetime кажется неправильным.

Пример структуры:

type Transaction struct {

    Id int64 `xml:"sequencenumber"`
    ReferenceNumber string `xml:"ourref"`
    Description string `xml:"description"`
    Type string `xml:"type"`
    CustomerID string `xml:"namecode"`
    DateEntered time.Time `xml:"enterdate"` //this is the field in question
    Gross float64 `xml:"gross"`
    Container TransactionDetailContainer `xml:"subfile"`
}

Возвращаемый формат даты - "yyyymmdd".

Ответ 1

У меня была та же проблема.

time.Time не удовлетворяет интерфейсу xml.Unmarshaler. И вы не можете указать дату fomat.

Если вы не хотите обрабатывать синтаксический анализ позже, и вы предпочитаете разрешать xml.encoding сделать это, одним из решений является создание структуры с анонимным полем time.Time и реализация собственного UnmarshalXML с вашим пользовательским формат даты.

type Transaction struct {
    //...
    DateEntered     customTime     `xml:"enterdate"` // use your own type that satisfies UnmarshalXML
    //...
}

type customTime struct {
    time.Time
}

func (c *customTime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    const shortForm = "20060102" // yyyymmdd 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
}

Если ваш XML-элемент использует атрибут как дату, вы должны реализовать UnmarshalXMLAttr таким же образом.

См. http://play.golang.org/p/EFXZNsjE4a

Ответ 2

Из того, что я прочитал, в кодировке /xml есть некоторые известные проблемы, которые были отложены до более поздней даты...

Чтобы обойти эту проблему, вместо использования типа time.Time используйте string и обработайте синтаксический анализ впоследствии.

У меня было немного проблем с получением времени. Для работы с датами в следующем формате: "Пт, 09 авг. 2013 19:39:39 GMT"

Как ни странно, я обнаружил, что "net/http" имеет функцию ParseTime, которая принимает строку, которая отлично работает... http://golang.org/pkg/net/http/#ParseTime

Ответ 3

Я внедрил XML-формат dateTime, соответствующий спецификации, вы можете найти его на GitHub: https://github.com/datainq/xml-date-time

Вы можете найти XML dateTime в W3C spec

Ответ 4

const shortForm = "20060102" // yyyymmdd date format

Это невозможно прочитать. Но это правильно в Го. Вы можете прочитать источник в http://golang.org/src/time/format.go