【问题标题】:How to add timezone information to DateTime of a SOAP request如何将时区信息添加到 SOAP 请求的 DateTime
【发布时间】:2015-10-13 16:32:56
【问题描述】:

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

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

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

2015-10-05T11:40:08

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

【问题讨论】:

  • DateTimeOffset
  • 或者尝试将DateTimeKind设置为Local
  • 我发现了一种奇怪的解决方法,这正是我所需要的:DateTime completeTime = DateTime.Parse(originalTime.ToString(), CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal);这正是我在 SoapUI 回复中所需要的:2015-10-05T13:40:08+02:00 感谢您的支持

标签: c# datetime soap wsdl timezone


【解决方案1】:

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

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

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

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

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

如果DateTimeOffset 得到正确支持,那么偏移量可以是任意值。但既然不是 - 您只能使用 DateTimeKind 表达的内容。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 2015-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多