【问题标题】:read client local time but not from user machine读取客户端本地时间,但不从用户机器读取
【发布时间】:2014-01-22 17:41:22
【问题描述】:

我需要读取用户(客户端机器)的本地时间。但我不想从客户端机器时间读取它。因为用户可以在他/她的 PC 中调整时间。

这是我想做的事情。

  1. 读取客户端 IP 地址。
  2. 使用任何 GEOIP API 获取该 IP 的时区
  3. 使用 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 记录所有内容,并在最后一刻,在您必须向人类展示某些内容之前,将其转换为他们的当地时间

标签: c# asp.net c#-4.0


【解决方案1】:

没有可靠的方法从客户端机器获取时间

  1. 客户端时间可能不可靠,因为客户端可以更改时间
  2. 你的技术有问题,如果有人在 vpn 后面,你得到的时间不会是客户的时区

【讨论】:

  • 我们都明白这个问题。这就是为什么我发布问题以查找是否有更好的方法(更可靠的方法)来获取客户端时区或直接获取客户端时间。
猜你喜欢
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2012-02-17
  • 2012-09-21
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多