用户时间和服务器时间不同的时区问题
问题描述:
基本上,我有一个Silverlight .net Web应用程序,用户可以根据他的日程安排他的日程安排等等。所以他选择一个时间和日期来运行任务,他可能在世界上的任何地方,然后这个时间日期被存储在数据库中,但是启动并运行这个计划任务的服务器将会在别的地方(比如说马耳他等),所以时区将会不同。如果不询问用户的时区,将用户时间转换为服务器时间,将服务器时间转换为用户时间,反之亦然,以便处理任务,最佳方式是什么?用户时间和服务器时间不同的时区问题
在此先感谢,乔恩
答
我想你想存储在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;
}
我不是专家,但我以前也遇到这种情况。我通过传递客户端时区作为请求的一部分来解决它。 – 2011-04-03 13:34:53