首页 > 解决方案 > WCF - 存储和恢复 UTC 日期时间

问题描述

我们向客户公开了一个 WCF Web 服务,允许他们将 DateTime 存储在 SQL Server 数据库中。WSDL 的摘录:

<xs:complexType name="TimePeriod">
<xs:sequence>
    <xs:element minOccurs="0" name="endDateTime" nillable="true" type="xs:dateTime"/>
    <xs:element minOccurs="0" name="startDateTime" nillable="true" type="xs:dateTime"/>
</xs:sequence>

例如,我的客户向我发送 UTC Datetime :

<af:effectivePeriod>
   <af:startDateTime>2018-01-16T10:32:28Z</af:startDateTime>
</af:effectivePeriod>

这是存储在 SQL Server 数据库中的一个datetime字段。

但是在读取服务的输出中,我没有 UTC 指示符:

<af:effectivePeriod>
   <af:startDateTime>2018-01-16T10:32:28</af:startDateTime>
</af:effectivePeriod>

“Z”是 DateTimes 的一种独特情况。文字“Z”实际上是 UTC 时间的 ISO 8601 DateTime 标准的一部分。当一个时间结束时加上“Z”(祖鲁语),它表示那个时间是UTC,所以实际上字面的Z是时间的一部分

我怎么可能Z在 read 方法的输出中得到 at ?我是否必须修改存储在 SQL Server 中的数据类型?我对服务的 WSDL 有影响吗?

标签: c#.netsql-serverwcfdatetime

解决方案


每当您需要保持时间偏移时,您应该使用 DateTimeOffset ( .net & SqlServer )

在您的 WCF 数据合同中,您可以添加 DateTimeOffset DataMember,但它会对客户端产生影响,并且您的服务 wsdl 将随着复杂类型 DateTimeOffset 的创建而改变:

<xs:complexType name="DateTimeOffset">
    <xs:annotation>
        <xs:appinfo>
            <IsValueType>true</IsValueType>
        </xs:appinfo>
    </xs:annotation>
    <xs:sequence>
        <xs:element name="DateTime" type="xs:dateTime"/>
        <xs:element name="OffsetMinutes" type="xs:short"/>
    </xs:sequence>
</xs:complexType>

推荐阅读