代码之家  ›  专栏  ›  技术社区  ›  wpfwannabe

强制XmlSerializer将日期时间序列化为“yyyy-mm-dd hh:mm:ss”

  •  56
  • wpfwannabe  · 技术社区  · 14 年前

    我有一些RESTful服务的XSD模式。与一起使用时 xsd.exe 用于生成C代码、XSD的工具 xs:date 生成以下代码:

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
    public System.DateTime time {
        get {
            return this.timeField;
        }
        set {
            this.timeField = value;
        }
    }
    

    将XML反序列化到对象时使用 XmlSerializer 一切似乎都很好。我面临的问题是,服务希望日期的格式为 YYYY-MM-DD hh:mm:ss 而XSD生成的代码似乎只生成 YYYY-MM-DD .

    如果我手动将xsd修改为 xs:dateTime 类型,生成的C代码生成: 2010-08-20T20:07:03.915039Z .

    基本上,如何强制序列化生成 年-月-日hh:mm:ss ?对于XSD有什么要做的吗?或者我可以做些什么来更改生成的C代码吗?

    5 回复  |  直到 6 年前
        1
  •  112
  •   kbrimington    14 年前

    在过去,我已经完成了以下操作来控制日期时间序列化:

    • 忽略日期时间属性。
    • 创建一个虚拟字符串属性,该属性按我想要的方式序列化/反序列化

    下面是一个例子:

    public class SomeClass
    {
        [XmlIgnore]
        public DateTime SomeDate { get; set; }
    
        [XmlElement("SomeDate")]
        public string SomeDateString
        {
            get { return this.SomeDate.ToString("yyyy-MM-dd HH:mm:ss"); }
            set { this.SomeDate = DateTime.Parse(value); }
        }
    }
    
        2
  •  46
  •   Alexander Abakumov    8 年前

    使用 [XmlElement(DataType = "date")] 属性来格式化 DateTime 属性值。

    From MSDN :

    注:
    注释publicationDate字段的属性具有 数据类型属性。.NET框架中没有匹配的类型 完全是xs:date类型。最接近的匹配是system.datetime, 它存储日期和时间数据。将数据类型属性指定为 “日期”确保XmlSerializer只序列化日期 日期时间对象的一部分。

        3
  •  3
  •   Eric    14 年前

    我相信实施 IXmlSerializable 界面会起作用。然后可以控制如何序列化和反序列化对象。

        4
  •  1
  •   Community rohancragg    7 年前

    如果你只需要清除毫秒部分。参考:

    How to truncate milliseconds off of a .NET DateTime

    基本上做如下的事情:

      startDateTimeToUse = startDateTimeToUse.AddTicks(-(startDateTimeToUse.Ticks % TimeSpan.TicksPerSecond));
      endDate = endDate.AddTicks(-(endDate.Ticks % TimeSpan.TicksPerSecond));
    

    我可以确认此序列号为:

                <startDate>2015-10-31T12:13:04</startDate>
                <endDate>2016-11-10T12:13:06</endDate>
    

    我也必须声明 以前 清除我执行此操作的毫秒数:

                var startDateTimeToUse = ssStartDateTime.ToUniversalTime();
                var endDate = DateTime.Now.ToUniversalTime();
                startDateTimeToUse = DateTime.SpecifyKind(startDateTimeToUse, DateTimeKind.Unspecified);
                endDate = DateTime.SpecifyKind(endDate, DateTimeKind.Unspecified);
    

    我不知道它是否对序列化有影响。

        5
  •  1
  •   Brian    6 年前

    请参阅上面的答案,但要添加--如果只希望在值为非空(例如,xml maxoccurs=0)时输出,则可以使用如下内容:

    private System.DateTime? someDateField;
    
    public string someDate
    {
        get
        {
            return someDateField?.ToString("MM-dd-yyyy");
        }
        set
        {
            dobField = System.DateTime.Parse(value);
        }
    }