我有一个端点,基于某些WSDL接收请求并构建响应对象,问题是我有一个DateTime字段,我必须用一个值填充。当我用DateTime.Now填充这个值时,我在SoapUI中看到的是以下是正确的:
2015-10-13T16:22:34.2701373 + 02:00
同时当我用逻辑检索的DateTime填充字段时,我认为这是错误的:
2015-10-05T11:40:08
因为我需要在DateTime填充时返回的完整信息。现在缺少什么以及如何将其添加到DateTime对象?
答案 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
或任何转化功能,例如ToLocalTime
,ToUniversalTime
或TimeZoneInfo
中的类似方法。如果您决定使用当地时间,请务必小心,因为从服务器获取时区通常不是一个好主意。最好按照普遍时间进行传播。
如果您只是填写当前时间,请使用DateTime.UtcNow
。如果您从数据库中加载基于UTC的DateTime
,请将DateTime.SpecifyKind
与DateTimeKind.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