如何在不同的TimeZone中将时间转换为本地时间

时间:2015-06-15 13:01:51

标签: c# asp.net asp.net-mvc timezone timezone-offset

目前我正在开展一个聊天项目,许多用户可以通过这个项目互相交流。即:不同的TimeZone。例如。 印度第一 在美国排名第二 俄罗斯第3名 澳大利亚第4名

我将我的消息发送时间保存到数据库中作为DateTime.Now.ToUniversalTime() 我得到的问题是,如果任何用户发送消息他得到正确的时间,如1分钟前,但休息将得到时间像4小时前。每个坐在不同国家的人都应该在1分钟前获得 我正在使用javascript来获取时区,如

 var offset = new Date().getTimezoneOffset();
 $("#timezoneOffset").val(offset); //setting timezone in hidden field and save as cookie.

要从数据库转换UTC时间以显示客户端时差:

var timeOffSet = Request.Cookies["timeoffset"].Value;
DateTime dt = Convert.ToDateTime("2015-06-15 12:13:12");
if (timeOffSet != null)
{
    var offset = int.Parse(timeOffSet.ToString());
    dt = dt.AddMinutes(-1 * offset);
    model.SentDate = FormatTime.TimeAgo(dt);
} 

我上次从印度寄来的这条消息,我在几秒钟之前得到了,但是我在北美的伴侣在4小时前得到了。

我做错了什么?以前格式转换DateTime的我的代码是:

public static string TimeAgo(DateTime dt)
{
    TimeSpan span = DateTime.Now - dt;
    if (span.Days > 365)
    {
        int years = (span.Days / 365);
        if (span.Days % 365 != 0)
            years += 1;
        return String.Format("about {0} {1} ago",
        years, years == 1 ? "year" : "years");
    }
    if (span.Days > 30)
    {
        int months = (span.Days / 30);
        if (span.Days % 31 != 0)
            months += 1;
        return String.Format("about {0} {1} ago",
        months, months == 1 ? "month" : "months");
    }
    if (span.Days > 0)
        return String.Format("about {0} {1} ago",
        span.Days, span.Days == 1 ? "day" : "days");
    if (span.Hours > 0)
        return String.Format("about {0} {1} ago",
        span.Hours, span.Hours == 1 ? "hour" : "hours");
    if (span.Minutes > 0)
        return String.Format("about {0} {1} ago",
        span.Minutes, span.Minutes == 1 ? "minute" : "minutes");
    if (span.Seconds > 5)
        return String.Format("about {0} seconds ago", span.Seconds);
    if (span.Seconds <= 5)
        return "just now";
    return string.Empty;
}

1 个答案:

答案 0 :(得分:1)

我在代码中看到的主要问题是TimeAgo()方法的第一行:传递给此方法的DateTime dt对象是客户端的本地时间,但是您使用本地服务器时间DateTime.Now来计算时间跨度。

将您从数据库中获取的UTC时间戳直接传递给此方法,并将DateTime.Now替换为DateTime.UtcNow