22

我有通过 REST API 检索的 XML 数据,我将其解组为 GO 结构。其中一个字段是日期字段,但是 API 返回的日期格式与默认 time.Time 解析格式不匹配,因此解组失败。

有什么方法可以指定 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”。

4

4 回答 4

59

我有同样的问题。

time.Time不满足xml.Unmarshaler接口。而且您不能指定日期格式。

如果您不想在之后处理解析并且您更愿意让它xml.encoding这样做,一种解决方案是创建一个具有匿名time.Time字段的结构并UnmarshalXML使用您的自定义日期格式实现您自己的。

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 元素使用属性作为日期,则必须以相同的方式实现 UnmarshalXMLAttr。

http://play.golang.org/p/EFXZNsjE4a

于 2014-07-29T12:24:27.560 回答
2

根据我的阅读,编码/xml 有一些已知问题已被推迟到以后的日期......

为了解决这个问题,而不是使用类型time.Time使用string并在之后处理解析。

我在获取时间时遇到了很多麻烦。解析以以下格式处理日期:“Fri, 09 Aug 2013 19:39:39 GMT”

奇怪的是,我发现“net/http”有一个 ParseTime 函数,它接受一个完美运行的字符串...... http://golang.org/pkg/net/http/#ParseTime

于 2013-08-16T06:41:22.200 回答
1

我已经实现了一个符合规范的 xml dateTime 格式,你可以在 GitHub 上找到它:https ://github.com/datainq/xml-date-time

您可以在 W3C规范中找到 XML dateTime

于 2017-09-03T20:27:57.100 回答
-1
const shortForm = "20060102" // yyyymmdd date format

这是不可读的。但它在 Go 中是正确的。您可以在http://golang.org/src/time/format.go中阅读源代码

于 2015-01-20T00:20:18.667 回答