万千封印
就像您使用 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)