如何在Go中序列化自定义格式的时间到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编码) 例如,类似()

从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)