c# - 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 有影响吗?
解决方案
每当您需要保持时间偏移时,您应该使用 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>
推荐阅读
- c# - datatables asp.net core razor pages IActionResult new JsonResult
- bash - 在 dockerfile 中加载 2 个进程?
- angular - 角度选择元素的 ngModel 不正确
- c# - 事件流和事件溯源
- time-complexity - theta(1) 在 n 次的总和是 theta(log n base 2)
- vba - VBA
- MyString 语句在代码中的作用如何? - j - J中的每个前置副词
- javascript - 使用Angular ngModel在输入类型日期中格式化日期时间
- visual-studio - 如何覆盖 docker-compose.vs.debug.g.yml 中的 Visual Studio 容器工具调试器卷?
- javascript - 如何从 Firestore 中检索第一个和最后一个集合