为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕标琳琳 2021-10-18 11:04:33
将日期时间序列化为 xml 时,如何使其使用自定义时间格式?
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

就像您使用 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.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 (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)


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信