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

4

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

服务器位于我的本地时区,客户端分布在全球各地。

我的当前策略是在服务器和数据库中使用UTC DateTime,并让客户端正确处理它们接收到的UTC DateTime。

这意味着每当客户端接收到一条消息,它的第一个任务就是将消息中包含的DateTime从UTC转换为本地时间。

我定义了一个接口,在所有我的[DataContract]对象中实现以帮助这个任务:

public interface IConvertToLocalTime {
   void ConvertToLocalTime();
}

我通常这样处理来自服务器的消息:

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

这个方法能够正常工作,但我不是很满意需要手动调用转换方法的事实。

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

3个回答

1
据我所知,WCF没有提供任何自动化工具来帮助时间转换,个人而言,我也不会指望它能够提供这样的功能。
我同意你的看法。手动调用转换程序并不是理想的解决方案。这种方式并不“优雅”。
对我而言,更优雅的解决方案是在需要时“懒惰地”评估DateTime。不要提供必须调用以将UTC时间转换为本地时间的函数,而是将此逻辑放在每个DateTime属性的get函数中。这样,当从对象检索DateTime时,它会自动转换为本地时间。

好的,所以你的意思是我应该在每个DateTime getter中检查一下我是在服务器上还是客户端上,只有在必要的时候才进行转换,是这样吗?这是个好主意:) - Brann
没错。这样,时间只在需要时进行转换。它消除了显式调用,并使解决方案更加优雅。 - Matt Davis

1

我可能没有理解问题,但是既然您在服务端和客户端都使用.NET,使用内置的DateTime.ToLocalTime和DateTime.ToUniversalTime不是更容易吗?您可以检查.Kind属性来确定DateTime是本地时间还是UTC时间。

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

您可能还想查看此SO问题,了解有关处理DateTime序列化的信息。


这正是我所做的。问题在于我必须手动为每个DateTime调用ToLocalTime()。 - Brann

0

当向用户呈现信息时,您可以使客户端精确地转换为/从本地时间,并在读取用户输入数据时首先进行相反的操作。然后,客户端的其余部分就可以使用UTC。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接