【发布时间】:2014-01-22 17:41:22
【问题描述】:
我需要读取用户(客户端机器)的本地时间。但我不想从客户端机器时间读取它。因为用户可以在他/她的 PC 中调整时间。
这是我想做的事情。
- 读取客户端 IP 地址。
- 使用任何 GEOIP API 获取该 IP 的时区
- 使用 C# TimeZoneInfo 类和 ConvertTImeFromUTC 方法获取该区域的当前本地时间
读取IP地址
public static string GetUserIP(System.Web.HttpContext context)
{
string retIPAddress = string.Empty;
string sIPAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(sIPAddress))
retIPAddress = context.Request.ServerVariables["REMOTE_ADDR"];
else
retIPAddress = sIPAddress.Split(',').FirstOrDefault();
return retIPAddress;
}
从IP地址API读取时区,如IPInfoDB
private static DateTime CurrentLocalTime()
{
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("what ever the time zone name returned by API"));
}
这种方法听起来不太可靠,因为时区 ID 可能与 API 不匹配。 有没有更好的方法来实现这个?
平台:ASP.NET
【问题讨论】:
-
我希望地理编码错误的数量大于更改自己计算机时间的人数。
-
IP 地址不是有效的时区指示符。例如,在亚利桑那州工作时,我似乎在美国东海岸——两三个小时的路程。我曾经在美国有过一份工作,我似乎在英国。
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
@JohnSaunders “我曾经在美国有过一份工作,我似乎在英国”这让我想知道您使用的地理定位服务有多糟糕,因为美国和英国位于不同的 RIR。跨度>
-
只有人类关心“当地时间”。以 UTC 记录所有内容,并在最后一刻,在您必须向人类展示某些内容之前,将其转换为他们的当地时间