如何在Go中序列化自定义格式的时间到xml或从xml到xml?
从xml序列化日期时间时,如何使其使用自定义时间格式?这取决于格式的外观,但时间库应该是一个良好的起点如何在Go中序列化自定义格式的时间到xml或从xml到xml?,xml,go,formatting,date-formatting,Xml,Go,Formatting,Date Formatting,从xml序列化日期时间时,如何使其使用自定义时间格式?这取决于格式的外观,但时间库应该是一个良好的起点 正如使用json实现json.Marshaler和json.Unmarshaler一样(在StackOverflow和internet上有很多关于这方面的帖子); 一种方法是实现实现和的自定义时间类型 编码项时,encoding/xml使用这些接口(在首先检查更具体的xml.Marshaler或xml.Unmarshaler接口之后,但是后面的接口必须自己进行完整的xml编码) 例如,类似()
正如使用json实现
json.Marshaler
和json.Unmarshaler
一样(在StackOverflow和internet上有很多关于这方面的帖子);
一种方法是实现实现和的自定义时间类型
编码项时,encoding/xml
使用这些接口(在首先检查更具体的xml.Marshaler
或xml.Unmarshaler
接口之后,但是后面的接口必须自己进行完整的xml编码)
例如,类似()的东西:
或
其中任何一个都可以用来代替time.time
,作为与xml(un)编组一起使用的更大数据结构的一部分。例如:
type Foo struct {
Date1 myTime1 `xml:"date1"`
Date2 myTime2 `xml:"date2"`
}
这些自定义时间类型定义方式的差异会改变您将它们与常规time.time
值一起使用的方式。
例如
你能提供一个你想要的格式的具体例子吗?
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
}
type Foo struct {
Date1 myTime1 `xml:"date1"`
Date2 myTime2 `xml:"date2"`
}
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)