如何将时区信息添加到SOAP请求的DateTime

时间:2015-10-13 16:32:57

标签: c# datetime soap wsdl timezone

我有一个端点,基于某些WSDL接收请求并构建响应对象,问题是我有一个DateTime字段,我必须用一个值填充。当我用DateTime.Now填充这个值时,我在SoapUI中看到的是以下是正确的:

  

2015-10-13T16:22:34.2701373 + 02:00

同时当我用逻辑检索的DateTime填充字段时,我认为这是错误的:

  

2015-10-05T11:40:08

因为我需要在DateTime填充时返回的完整信息。现在缺少什么以及如何将其添加到DateTime对象?

3 个答案:

答案 0 :(得分:3)

"使用DateTimeOffset"通常是很好的建议,但问题的一部分可能是当从WSDL(使用WCF或.asmx)自动生成类时,XSD中的xs:DateTime类型被创建为DateTime个对象。所以 - 不能。

不幸的是,没有好的解决方案。如果您实际上尝试在源代码中的模型中使用DateTimeOffset,则WSDL会获得一个奇怪的复杂对象。如果您尝试更改接收方,则无法将xs:DateTime反序列化为DateTimeOffset

这是WCF,SOAP和XSD的弱点。阅读WCF DateTimeOffset compatibility中的更多内容。

填充数据时唯一的解决方法是将DateTime字段显式设置为local或UTC类型。您可以使用DateTime.SpecifyKind或任何转化功能,例如ToLocalTimeToUniversalTimeTimeZoneInfo中的类似方法。如果您决定使用当地时间,请务必小心,因为从服务器获取时区通常不是一个好主意。最好按照普遍时间进行传播。

如果您只是填写当前时间,请使用DateTime.UtcNow。如果您从数据库中加载基于UTC的DateTime,请将DateTime.SpecifyKindDateTimeKind.Utc一起使用。如果您已有DateTimeOffset,则可以使用.UtcDateTime属性将其分配给模型中的DateTime值。

如果正确支持DateTimeOffset,那么偏移量可以是任意的。但由于事实并非如此 - 您仅限于使用DateTimeKind表达的内容。

答案 1 :(得分:0)

使用DateTimeOffset:https://msdn.microsoft.com/en-us/library/system.datetimeoffset(v=vs.110).aspx 这将解决你的问题!

答案 2 :(得分:-1)

代码中填充的DateTime值应具有Kind属性等于Local或Utc。https://msdn.microsoft.com/en-us/library/system.datetime.kind(v=vs.110).aspx