如何在 Go 中将自定义格式的时间序列化为 xml 或从 xml 序列化?

将日期时间序列化为 xml 时,如何使其使用自定义时间格式?


慕标琳琳
浏览 188回答 2
2回答

万千封印

就像您使用 JSON实现json.Marshaler和json.Unmarshaler执行此操作一样(在 StackOverflow 和互联网上有很多关于此的帖子);一种方法是实现实现encoding.TextMarshaler和的自定义时间类型encoding.TextUnmarshaler。这些接口encoding/xml在对项目进行编码时使用(在首先检查更具体的xml.Marshaler或xml.Unmarshaler接口之后,但是后来的那些必须自己进行完整的 XML 编码)。例如类似(完整示例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.Timefunc (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 (un) marshalling 一起使用的更大数据结构的一部分。例如: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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go