用户时间和服务器时间不同的时区问题

问题描述:

基本上,我有一个Silverlight .net Web应用程序,用户可以根据他的日程安排他的日程安排等等。所以他选择一个时间和日期来运行任务,他可能在世界上的任何地方,然后这个时间日期被存储在数据库中,但是启动并运行这个计划任务的服务器将会在别的地方(比如说马耳他等),所以时区将会不同。如果不询问用户的时区,将用户时间转换为服务器时间,将服务器时间转换为用户时间,反之亦然,以便处理任务,最佳方式是什么?用户时间和服务器时间不同的时区问题

在此先感谢,乔恩

+0

我不是专家,但我以前也遇到这种情况。我通过传递客户端时区作为请求的一部分来解决它。 – 2011-04-03 13:34:53

我想你想存储在UTC时间在服务器上的一切,然后将其转换回了用户的时间,当你走在客户端应用程序,以显示它。当用户安排任务时,将该时间转换为客户端的UTC时间并将其传递给服务器。然后服务器总是将UTC时间传递回客户端。

下面是一个快速代码示例,从客户端获取UTC时间并将其转换为当地时间。

//Get UTC time 
var utcTime = DateTime.UtcNow; 
Console.WriteLine("{0} {1}", utcTime, utcTime.Kind); 

//Convert UTC time to local time 
var localTime = utcTime.ToLocalTime(); 
Console.WriteLine("{0} {1}", localTime, localTime.Kind); 

Kind属性会告诉你,如果你正在处理本地或UTC时间。这个SO question也有关于从UTC转换到本地时间的一些很好的信息。

>请告诉我没有要求的用户的时区

你还去要承担客户端操作系统时区设置正确的最好的方式(这往往并非如此),并使用该时区转换为/从您的服务器时间这应该在UTC

这里有几个扩展方法,可以让你做到这一点。

发送给客户端的任何日期都应该在客户端UI上呈现之前调用ToDisplayTime()

同样,在客户端向服务器发送日期之前,应该调用FromDisplayTime()将其转换为UTC。 因此服务器UTC发送和接收时间只有

/// <summary> 
    /// Converts the specified DateTime (which should be the UTC time) into the users timezone. 
    /// </summary> 
    /// <param name="utcDateTime"></param> 
    /// <returns></returns> 
    public static DateTime ToDisplayTime(this DateTime utcDateTime) 
    { 
     var result = TimeZoneInfo.ConvertTime(utcDateTime, TimeZoneInfo.Local); 
     return result; 
    } 

    /// <summary> 
    /// Converts the specified DateTime from local time to UTC 
    /// </summary> 
    /// <param name="locatDateTime"></param> 
    /// <returns></returns> 
    public static DateTime FromDisplayTime(this DateTime locatDateTime) 
    { 
     var result = TimeZoneInfo.ConvertTime(locatDateTime, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById("UTC")); 
     return result; 
    } 
+0

timezoneinfo类获取用户所在时区的一个问题?它是否需要用户操作系统时区?谢谢 – jon 2011-04-03 17:43:39

+0

是的,但如上所述,这可能会导致问题,假设您的用户坐在悉尼澳大利亚(+10 UTC),并且他们的操作系统上的时区为-8,那么如果您的用户输入时间,它将会不同于他们认为他们将在18点前进入!在这种情况下,您将不得不向用户确认他们的时区是否正确。 – wal 2011-04-03 23:22:16