【问题标题】:Handling WCF Deserialization of DateTime objects处理 DateTime 对象的 WCF 反序列化
【发布时间】:2008-11-03 15:35:54
【问题描述】:

我们正在运行一个调度应用程序,它调用 WCF 服务来运行夜间作业。其中大量包括有关当前营业日期的信息。出于业务原因,调度服务器设置为 GMT,但我们的服务在设置为纽约时间的服务器上运行。

这引发了一个问题;日期将通过明确的时区信息传递给我们的 .NET 服务。因此,当服务告诉应用程序以“2008-11-03 00:00:00 +0:00”的日期运行时,服务会将其解释为“2008-11-02 19:00:00 -5:00” "而且事情的日期是错误的。

调度器的行为是第三方硬编码的,所以我们不能告诉调度器忽略时区偏移。我们不想总是将日期转换为 GMT,因为我们的亚洲办事处很有可能会调用相同的服务,而我们又会遇到同样的问题。

有没有办法标记 DataContract,甚至将其控制在足够低的级别以确保 DateTime Kind 是未指定的?或者有没有办法使用 DateTime 来确定用于创建它的原始信息是什么,并在后处理步骤中将其转换回原始值?

如果有帮助,现在我们的合同相当简单。方法采用一个参数,该参数是从下面的类派生的类。

[DataContract]
public class BaseTimeSensitiveParameters
{
    [DataMember] public DateTime? BusinessDate;
}

【问题讨论】:

  • 如果要将调度服务器设置为 GMT,请将操作系统时区设置为 GMT。

标签: c# wcf datetime


【解决方案1】:

如果我正确理解了这个问题,您可以通过在服务端使用DateTime.ToUniversalTime() 在后期处理中解决这个问题。对于您的示例,这应该为您提供一个值为“2008-11-03 00:00:00”且 Kind=DateTimeKind.Utc 的 DateTime。现在,如果您需要相同的值,但作为 Local 或 Unspecified,您可以使用 DateTime.SpecifyKind(DateTime, DateTimeKind) 设置 Kind 而无需更改值。

【讨论】:

  • 是的...将服务返回的内容保留为 UTC,留给客户端进行转换或解释。
猜你喜欢
  • 2015-10-06
  • 1970-01-01
  • 2023-03-15
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多