2009-02-04 15 views
4

我有一个用WCF/C#3.5编写的客户端/服务器应用程序。在WCF客户端/服务器应用程序中计算UTC /本地日期时间转换的最佳方法

服务器位于本地时区,客户端遍布全球。

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

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

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

public interface IConvertToLocalTime { 
    void ConvertToLocalTime(); 
} 

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

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

这工作正常,但我不太满意的事实,我必须手动调用转换方法。

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

回答

1

据我所知,WCF不提供任何类型的自动化来帮助时间转换,而且我个人并不期望它。

我同意你的意见。不得不手动调用转换例程并不理想。它不“感觉”优雅。

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

+0

好的,所以你的意思是我应该检查每个DateTime getter,如果我在服务器或客户端上,以便只在需要时才进行转换,就是这样吗?这是一个好主意:) – Brann 2009-02-04 22:04:43

+0

没错。这样,时间才会根据需要进行转换。它消除了显式调用并使解决方案更加优雅。 – 2009-02-04 22:34:33

1

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

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

您可能也想看看this SO Question关于处理日期时间序列化。

0

当向用户呈现信息时,您可以使客户端精确地转换为当地时间,反之,在读取用户输入的数据时首先执行此操作。客户端的其余部分可以使用UTC。

相关问题