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

时间:2011-04-03 13:32:04

标签: c# .net silverlight-4.0

基本上我有一个silverlight .net网络应用程序,由用户为他的任务等安排工作。所以他选择一个时间和日期来运行任务,他可以在世界的任何地方,然后这个时间日期获取并存储在数据库中的服务器,然后获取并运行此计划任务的服务器将位于其他位置(比如马耳他等),因此时区将不同。什么是最好的方式而不询问用户的时区,将用户时间转换为服务器时间,将服务器时间转换为用户时间,反之亦然,以便处理任务?

提前致谢, 乔恩

2 个答案:

答案 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;
    }