在WCF客户端/服务器应用程序中计算UTC /本地日期时间转换的最佳方法

时间:2009-02-04 10:13:35

标签: c# .net wcf datetime timezone

我有一个客户端/服务器应用程序,用WCF / C#3.5编写。

服务器位于我当地的TimeZone,客户遍布全球。

我目前的策略是在服务器和数据库中的每个地方使用UTC DateTime,并让客户端正确处理他们收到的UTC日期时间。

这意味着每次客户端收到消息时,其首要任务是将消息中包含的DateTimes从UTC转换为Local。

我已经定义了一个接口,由我的所有[DataContract]对象实现,以帮助完成这项任务:

public interface IConvertToLocalTime {
   void ConvertToLocalTime();
}

所以我通常以这种方式处理来自服务器的消息:

public void ServerCallbackFoo(MyObject a, MyObject2 b)
{
  a.ConvertToLocalTime();
  b.ConvertToLocalTime();
  // my business code goes there
}

这很好用,但我不太满意我必须手动调用转换方法的事实。

在我看来,这个任务应该由WCF框架管理。我错过了什么吗?有没有更好的方法来自动转换?

3 个答案:

答案 0 :(得分:1)

据我所知,WCF没有提供任何类型的自动化来帮助进行时间转换,而且个人而言,我不希望这样做。

我同意你的看法。必须手动调用转换例程并不理想。它并没有“感觉”优雅。

对我而言,更优雅的解决方案是“懒洋洋地”评估DateTime,因为它是需要的。不是提供必须调用以将UTC时间转换为本地时间的函数,而是将此逻辑放在每个DateTime属性的get函数中。这样,当从对象中检索DateTime时,它会自动转换为本地时间。

答案 1 :(得分:1)

我可能不理解这个问题,但是根据需要使用内置的DateTime.ToLocalTime和DateTime.ToUniversalTime并不容易,因为您对服务和客户端都使用.NET。您应该能够检查.Kind属性以查看DateTime是本地还是UTC。

DateTime test = DateTime.Now; //already local time
DateTime LocalTest = test.ToLocalTime();
DateTime UtcTest = test.ToUniversalTime();

您可能还想查看有关处理DateTime序列化的this SO Question

答案 2 :(得分:0)

您可以在向用户显示信息时准确地将客户端转换为本地时间/从本地时间转换,反之,在读取用户输入的数据时首先执行此操作。然后客户端的其余部分可以使用UTC。