我有通过REST API检索的XML数据,我正在解组为GO结构。其中一个字段是日期字段,但API返回的日期格式与默认的time.Time解析格式不匹配,因此unmarshal失败。
有没有办法为unmarshal函数指定在time.Time解析中使用哪种日期格式?我想使用正确定义的类型,并使用字符串来保存日期时间字段感觉不对。
示例结构:
type Transaction struct {
Id int64 `xml:"sequencenumber"`
ReferenceNumber string `xml:"ourref"`
Description string `xml:"description"`
Type string `xml:"type"`
CustomerID string `xml:"namecode"`
DateEntered time.Time `xml:"enterdate"` //this is the field in question
Gross float64 `xml:"gross"`
Container TransactionDetailContainer `xml:"subfile"`
}
返回的日期格式为“yyyymmdd”。
答案 0 :(得分:50)
我遇到了同样的问题。
time.Time
不满足xml.Unmarshaler
接口。并且您无法指定日期格式。
如果你不想在之后处理解析而你更愿意让xml.encoding
这样做,一个解决方案就是创建一个带有匿名time.Time
字段的结构并实现你自己的UnmarshalXML
1}}使用您的自定义日期格式。
type Transaction struct {
//...
DateEntered customTime `xml:"enterdate"` // use your own type that satisfies UnmarshalXML
//...
}
type customTime struct {
time.Time
}
func (c *customTime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
const shortForm = "20060102" // yyyymmdd date format
var v string
d.DecodeElement(&v, &start)
parse, err := time.Parse(shortForm, v)
if err != nil {
return err
}
*c = customTime{parse}
return nil
}
如果您的XML元素使用attribut作为日期,则必须以相同的方式实现UnmarshalXMLAttr。
答案 1 :(得分:1)
根据我的阅读,encoding / xml有一些已知的问题,这些问题一直推迟到以后......
要解决此问题,请使用time.Time
类型而不是使用string
类型,然后再处理解析。
我在获取时间方面遇到了很多麻烦。请按以下格式使用日期:“星期五,2013年8月9日19:39:39 GMT”
奇怪的是,我发现“net / http”有一个ParseTime函数,它带有一个完美的字符串...... http://golang.org/pkg/net/http/#ParseTime
答案 2 :(得分:1)
我已经实现了符合规范的xml dateTime格式,您可以在GitHub上找到它:https://github.com/datainq/xml-date-time
您可以在W3C spec
中找到XML dateTime答案 3 :(得分:-1)
const shortForm = "20060102" // yyyymmdd date format
这是不可读的。但它在Go中是正确的。您可以在http://golang.org/src/time/format.go
中阅读来源