如何将时间转换为不同时区的本地时间
How to Convert a Time to local Time in Different TimeZone
目前我正在从事一个聊天项目,许多用户可以通过该项目在全球各地相互交流。即:不同的时区。例如。
印度第一
美国第二
俄罗斯第三
澳大利亚第 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 转换为 ago 格式的代码是:
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;
}
我在你的代码中看到的主要问题是你的 TimeAgo()
方法的第一行:你传递给这个方法的 DateTime dt
对象是你的客户的本地时间,但是你使用服务器当地时间 DateTime.Now
计算时间跨度。
将从数据库中获取的 UTC 时间戳直接传递给此方法,并将 DateTime.Now
替换为 DateTime.UtcNow
。
目前我正在从事一个聊天项目,许多用户可以通过该项目在全球各地相互交流。即:不同的时区。例如。 印度第一 美国第二 俄罗斯第三 澳大利亚第 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 转换为 ago 格式的代码是:
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;
}
我在你的代码中看到的主要问题是你的 TimeAgo()
方法的第一行:你传递给这个方法的 DateTime dt
对象是你的客户的本地时间,但是你使用服务器当地时间 DateTime.Now
计算时间跨度。
将从数据库中获取的 UTC 时间戳直接传递给此方法,并将 DateTime.Now
替换为 DateTime.UtcNow
。