.NET使用本地时区

时间:2015-04-17 10:21:05

标签: c# asp.net web-services wcf datetime

我遇到了从第三方网络服务传回来的日期时间问题。

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

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

使用.NET添加对服务的引用后,引用文件是visitDate的属性,它是DateTime类型。因此,从visitDate属性返回的值将转换为本地时区。

该服务始终将时间部分返回为午夜+ 2(“2015-04-14T00:00:00 + 02:00”),.NET将日期转换为上一个日期,例如:“2015-04-13 23:00:00” 。因此,我的报告总是显示错误的日期(落后一天)。

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

我只是想知道是否有人遇到过这样的问题,希望能解决一下这个问题吗?


更新

只是为了解释这一点: 从服务返回的访问日期是通过输入屏幕在先前的事务中添加的日期。返回visitdate服务时,总是将时间元素替换为“00:00:00”,因此您将日期视为“2015-04-14T00:00:00 + 02:00”。

以下是发生的事情(基于今天的日期)
输入值:17/04/2015 11:52:39
服务回程: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-13 23:00:00”: 类似于:visitDate.AddDays(1)。日期 会给你:2015-04-14 00:00:00

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

2 个答案:

答案 0 :(得分:1)

该服务返回UTC日期格式:http://en.wikipedia.org/wiki/ISO_8601,并且比UTC(+02:00)提前2小时处于时区。您距离UTC仅1小时,因此距离服务3小时,因此午夜UTC服务时间为凌晨02:00,晚上11:00(23:00)为您服务。

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

答案 1 :(得分:0)

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

不幸的是,WCF does not support xs:date,这意味着在不同时区的机器之间进行通信时,仅限日期参数会有歧义。

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

  • 返回没有时区信息的xs:dateTime(2015-04-14T00:00:00),我认为您可以通过指定DateTimeKind.Unspecified来使用.NET服务。

  • 以UTC格式返回日期。

您也可以在客户端代码中使用DateTimeOffset来获取服务器时区的日期/时间,然后根据需要进行解释。