将DateTime序列化为没有毫秒和GMT时间的时间

12

我使用一个XSD文件创建了一个C#类文件。我的其中一个属性如下:

 private System.DateTime timeField;

 [System.Xml.Serialization.XmlElementAttribute(DataType="time")]
 public System.DateTime Time {
     get {
         return this.timeField;
     }
     set {
         this.timeField = value;
     }
 }

当序列化时,文件的内容现在看起来像这样:

<Time>14:04:02.1661975+02:00</Time>

使用属性上的XmlAttributes,是否可以使其呈现为没有毫秒和GMT值的形式,例如这样?

<Time>14:04:02</Time>

这是否可行,还是我需要在类序列化后通过某种xsl / xpath替换魔法来进行处理?

把对象转换为字符串不是解决方案,因为它在应用程序的其余部分中像DateTime一样使用,并允许我们通过使用XmlSerializer.Serialize()方法从对象创建xml表示。

我需要从字段中删除额外信息的原因是接收系统不符合时间数据类型的w3c标准。


请查看https://dev59.com/9nA65IYBdhLWcg3w-jym。 - TNT
2个回答

24
在Time属性上添加[XmlIgnore],然后添加一个新属性。
[XmlElement(DataType="string",ElementName="Time")]
public String TimeString
{
    get { return this.timeField.ToString("yyyy-MM-dd"); }
    set { this.timeField = DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); }
}

2
“yyyy-MM-dd”是时间字段的正确格式字符串吗?虽然这个解决方案对我来说并没有立即奏效,但它确实引导我找到了一个可行的解决方案。我不得不使用“HH:mm:ss”,并从我的“dateField”中获取,就像这样:get { return this.dateField.ToString("HH:mm:ss"); } - OutstandingBill
同样适用于Uri数据类型。这就是我的问题,以及我如何解决它。[JsonIgnore] [XmlIgnore] public Uri UrlIgnore { get; set; }[JsonProperty("url")] [XmlElement] public string Url { get { return Convert.ToString(UrlIgnore); } set { UrlIgnore = new Uri(value); } } - fluidguid

14

你可以创建一个字符串属性,用于将时间字段进行翻译,并将序列化属性放在该属性上,而不是实际的DateTime属性,这样其他应用程序使用的DateTime属性就不会受到影响。


今天我也不得不做完全相同的事情 :) - leppie
如果我们以后需要对同一个文件进行反序列化,这个方法也能用吗? - Espo
这就是我解决它的方式。我可以接受两个答案,但Jeffrey先回答了。我能做的最好的事情就是点赞 :) - Espo
如果你的XSD不会改变,我认为这是最简单的解决方案。 - parameter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接