【问题标题】:How to Convert a Time to local Time in Different TimeZone如何将不同时区的时间转换为当地时间
【发布时间】:2015-08-30 23:46:26
【问题描述】:

目前我正在开发一个聊天项目,许多用户可以通过该项目在全球各地进行交流。即:不同的时区。例如。 印度第一 美国第二 俄罗斯第三 澳大利亚第 4 名

我将我的消息发送时间作为 DateTime.Now.ToUniversalTime() 保存到数据库中 我遇到的问题是,如果任何用户 sent message 他在 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;
}

【问题讨论】:

  • 使用 Jon Skeet (y) 的 NodaTime
  • 在哪里使用 NodaTime ??我会尝试,但如果你给我举个例子@Randolph,它会节省我的时间
  • github.com/nodatime/nodatime :) 这是 GitHub 上的项目。这是网站:nodatime.org。你可以在那里找到很多例子;)
  • 你为什么要从客户端发送本地时间? (我还建议使用DateTime.UtcNow 而不是在服务器上获取本地时间并转换它...)还要注意时区偏移现在可能与偏移不同在其他时间点。
  • 是的,将所有内容都保存为 UTC。然后根据需要为界面来回转换。

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


【解决方案1】:

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

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

【讨论】:

  • 前两段+1,但最后一段不是必需的。一旦记录的时间是 UTC,并且与 UTC 进行比较,那么客户端的时区就变得无关紧要了。
  • 但是,就您自己的知识而言,偏移量确实必须被否定才能从 UTC 转换为本地时间,因为 JS 使用 UTC 的正值 east 获取偏移量,这与正常约定相反。
  • @MattJohnson 谢谢,你是对的,我删除了答案的那一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
相关资源
最近更新 更多