2015-10-13 91 views
2

我有一个基于某些WSDL接收请求并构建响应对象的端点,问题是我有一个DateTime字段,我必须填充一个值。当我填补DateTime.Now这个值是我在了SoapUI看到的是这是正确如下:如何将时区信息添加到SOAP请求的日期时间

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

同时,当我填写有日期时间字段由逻辑检索到的我这是错误的:

2015-10-05T11:40:08

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

+4

请参阅'DateTimeOffset'。 – Mitch

+0

https://msdn.microsoft.com/en-us/library/system.datetimeoffset(v=vs.110).aspx –

+0

或者尝试将'DateTime'的种类设置为本地 – AlexDev

回答

3

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

不幸的是,这没有好的解决方案。如果你真的试图在你的模型中使用DateTimeOffset,那么WSDL会得到一个奇怪的复杂对象。如果您尝试更改接收端,则无法将xs:DateTime反序列化为DateTimeOffset

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

填充数据时唯一的解决方法是将DateTime字段显式设置为本地或UTC类型。您可以使用DateTime.SpecifyKind或任何转换函数,例如ToLocalTime,ToUniversalTime或来自TimeZoneInfo的类似方法。如果您决定使用本地时间,请谨慎小心,因为从服务器获取时区通常不是一个好主意。按照世界时间来传输是最好的。

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

如果DateTimeOffset得到正确支持,那么偏移量可以是任意的。但由于它不是 - 你只能用DateTimeKind来表达你的想法。