При сериализации datetime в/из xml, как мне заставить использовать пользовательский формат времени?Как сериализовать настраиваемое время форматирования в/из xml в Go?
ответ
Так же, как вы бы реализовать json.Marshaler
и json.Unmarshaler
для этого с JSON (есть много сообщений о том, что на StackOverflow и в Интернете); Один из способов - реализовать пользовательский тип времени, который реализует encoding.TextMarshaler
и encoding.TextUnmarshaler
.
Эти интерфейсы используются при кодировании элементов encoding/xml
(после первой проверки более конкретных интерфейсов xml.Marshaler
или xml.Unmarshaler
, однако эти более поздние должны выполнять полную кодировку XML).
E.g. что-то вроде (full example on the Go Playground):
const fixedFormat = "Mon Jan 02 2006"
type myTime1 struct {
time.Time
}
func (m myTime1) MarshalText() ([]byte, error) {
text := m.Time.Format(fixedFormat)
return []byte(text), nil
}
func (m *myTime1) UnmarshalText(text []byte) error {
t, err := time.Parse(fixedFormat, string(text))
if err == nil {
m.Time = t
}
return err
}
или
type myTime2 time.Time
func (m myTime2) MarshalText() ([]byte, error) {
text := time.Time(m2).Format(fixedFormat)
return []byte(text), nil
}
func (m *myTime2) UnmarshalText(text []byte) error {
t, err := time.Parse(fixedFormat, string(text))
if err == nil {
*m = myTime2(t)
}
return err
}
Любые из тех, может быть использован вместо time.Time
как часть более крупной структурой данных, используемой с XML (ООН) маршалингом. Например .:
type Foo struct {
Date1 myTime1 `xml:"date1"`
Date2 myTime2 `xml:"date2"`
}
Разница в том, как эти пользовательские типы времени определяются изменения, как вы используете их с регулярными time.Time
значениями. .
m1 := myTime1{time.Now()}
fmt.Println(m1)
if m1.Before(time.Now()) {}
t1 := m1.Time
// compared to:
m2 := myTime2(time.Now())
fmt.Println(time.Time(m2))
if time.Time(m2).Before(time.Now()) {}
t2 := time.Time(m2)
Это зависит от того, как выглядит ваш формат, но хорошей отправной точкой является библиотека времени. http://golang.org/pkg/time/
layout := "2006-01-02T15:04:05.000Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout, str)
if err != nil {
fmt.Println(err)
}
fmt.Println(t)
Не могли бы вы указать конкретный пример формата, который вы хотите? – lsowen