基本上我有一个silverlight .net网络应用程序,由用户为他的任务等安排工作。所以他选择一个时间和日期来运行任务,他可以在世界的任何地方,然后这个时间日期获取并存储在数据库中的服务器,然后获取并运行此计划任务的服务器将位于其他位置(比如马耳他等),因此时区将不同。什么是最好的方式而不询问用户的时区,将用户时间转换为服务器时间,将服务器时间转换为用户时间,反之亦然,以便处理任务?
提前致谢, 乔恩
答案 0 :(得分:2)
我认为您希望以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);
如果您正在处理本地或UTC时间,Kind属性将告诉您。这个SO question也有一些关于从UTC转换到本地时间的好信息。
答案 1 :(得分:0)
>在没有询问用户时区的情况下,最好的方式是什么
然后您必须假设客户端操作系统时区已正确设置(通常不是这种情况)并使用此时区转换为服务器时间应该是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;
}