.NET 使用本地时区

.NET Using Local Time Zones

我对从第三方 Web 服务传回的日期时间有疑问。

来自服务的日期字段(visitDate)是日期类型。以下是 WSDL 中的内容。

<xs:element minOccurs="0" name="visitDate" type="xs:dateTime"/>

使用 .NET 添加对服务的引用后,访问日期的引用文件 属性 是 DateTime 类型。因此,visitDate 属性 中的值 returns 被转换为本地时区。

服务始终return将时间部分设为午夜+2(“2015-04-14T00:00:00+02:00”),.NET 将日期转换为前一个日期例如:“2015-04-13 23:00:00”。由于这个原因,我的报告总是显示错误的日期(晚了一天)。

完成服务的人说 visitDate.AddDays(1) 或使用消息检查器的 AfterReceiveReply 方法执行字符串操作以剥离时区部分并重新计算日期。

我只是想知道是否有人遇到过这样的问题,希望能提供一些解决方案?


更新

再解释一下: 来自服务的 returns 的访问日期是通过输入屏幕添加到先前事务中的日期。当 returning visitdate 服务时,总是将时间元素替换为“00:00:00”,因此您将日期视为“2015-04-14T00:00:00+02:00”。

以下是实际情况(基于今天的日期)
输入值:17/04/2015 11:52:39
服务 return:2015-04-17 T00:00:00+02:00
.Net 解析为:2015-04-16 23:00:00

我要在报告中显示的日期是“2015/04/17”而不是“2015/04/16”。

更新 我们向第三方团队提出了这个问题,这是他们的建议

如果xml中的值为‘2015-04-14T00:00:00+2:00’,解析后的值为‘2015-04-1323:00:00’: 类似于:visitDate.AddDays(1).Date 会给你:2015-04-1400:00:00

如果使用 WCF,更简洁(但更复杂)的解决方案是将代码添加到消息检查器的 AfterReceiveReply 方法中,该方法执行字符串操作以去除时区部分。

该服务正在返回 UTC 日期格式:http://en.wikipedia.org/wiki/ISO_8601,并且所在的时区比 UTC 早 2 小时 (+02:00)。您比 UTC 晚 1 小时,因此比服务晚 3 小时,因此午夜 UTC 是服务 02:00 AM,而您是 11:00 PM (23:00)。

到目前为止一切顺利。您需要决定要对日期做什么。您要以本地时间、服务本地时间还是 UTC 时间显示它?如果是第一个,那么您的报告当前是正确的,因为它显示的是与服务相比的前一天,因为当它是 UTC 午夜时,与您的时间相比,在同一时间服务已经在下一个日历日区域。

您的字段是日期时间 (xs:dateTime),而不是日期 (xs:date)。

不幸的是,WCF does not support xs:date,这意味着在不同时区的机器之间通信时,date-only参数会出现歧义。

如果您可以让第三方服务提供商进行更改,可能的解决方法是:

  • Return xs:dateTime 没有时区信息 (2015-04-14T00:00:00),我认为您可以通过指定 DateTimeKind.Unspecified.

  • Return UTC 日期。

您也可以在客户端代码中使用 DateTimeOffset 来获取服务器时区的 date/time,然后对其进行适当的解释。