【问题标题】:How do I prevent DateTime from including zone offset in SOAP xsd:dateTime element?如何防止 DateTime 在 SOAP xsd:dateTime 元素中包含区域偏移量?
【发布时间】:2008-10-29 18:53:47
【问题描述】:

我在一些 WSDL 中有这个:

<element name="startDate" type="xsd:dateTime"/>
<element name="endDate" type="xsd:dateTime"/>

这会在 SOAP 信封中产生以下文本:

<startDate>2008-10-29T12:01:05</startDate>
<endDate>2008-10-29T12:38:59.65625-04:00</endDate>

只有一些时间有毫秒和区域偏移量。这让我很头疼,因为在这个例子中我试图获得 37 分 54 秒的范围,但是由于偏移量,我最终得到了 4 小时 37 分 54.65625 秒。这是 DateTime 中的某种舍入错误吗?如何防止这种情况发生?

【问题讨论】:

    标签: .net datetime soap


    【解决方案1】:

    我怀疑您的 endDate 值将 Kind 属性设置为 DateTimeKind.Local。

    您可以将其更改为 DateTimeKind.Unspecified,如下所示:

    endDate = DateTime.SpecifyKind(endDate, DateTimeKind.Unspecified)
    

    之后我相信它将在没有时区偏移的情况下被序列化。

    请注意,如果您使用 DateTime.Now 或 DateTime.Today 对其进行了初始化,您将获得一个 DateTime 和 DateTimeKind.Local,如果您使用 Datetime.UtcNow 对其进行了初始化,您将获得 DateTimeKind.Utc。

    【讨论】:

    • 这完美解决了我的问题,无需修改任何服务器端代码
    【解决方案2】:

    您使用什么来生成日期?如果您在代码中构建此 XML 而不是使用某些序列化程序(WCF 或 XmlSerializer),则可以使用 System.Xml.XmlConvert 生成和解释日期,如下所示:

    创建要放入 XML 的字符串:

    DateTime startDate = DateTime.Now;
    string startDateString = System.Xml.XmlConvert.ToString(startDate);
    

    从 XML 中获取日期:

    DateTime startDateFromXml = System.Xml.XmlConvert.ToDateTime(startDateString);
    

    如果您从两个相差 37 分 54 秒的 DateTime 实例开始,然后将它们推送到 XML 中,那么在您将它们从 XML 中拉出后,它们仍然会相差 37 分 54 秒。

    【讨论】:

      猜你喜欢
      • 2015-10-24
      • 2012-06-26
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2010-09-17
      • 1970-01-01
      相关资源
      最近更新 更多