【问题标题】:Get TimeZone by Country/Region in Java在 Java 中按国家/地区获取时区
【发布时间】:2012-12-17 14:31:58
【问题描述】:

我的应用程序托管在美国。服务器时区为 GMT。现在,当人们从全球范围内访问此应用程序时,我想获取访问它的国家/地区的时区。说 - 我正在从欧洲的某个地方访问。我想获取该特定地区的时区。我希望用 Java 完成。

【问题讨论】:

  • 这是一个网络应用程序还是其他什么?
  • 我不认为 jdk/jre 包含这个。他们有一个 TZ 数据库,但他们没有将位置映射到 TZ
  • @Jon,这是一个 Web 应用程序
  • @user1445777:在这种情况下,您实际上是依靠 Javascript 为您提供时区,除非您以其他方式知道用户在哪里。 你知道吗? (例如,IP 地理编码是一种选择 - 或者用户可能以其他方式指定了他们的位置。)

标签: java timezone


【解决方案1】:

您可以采取两种方法:

  1. 检测平台设置
  2. IP 地理编码

方法 1 是为此使用 javascript。我使用了一个我发现here 的模块,效果很好。我在“跳转页面”上使用了与此类似的代码,它只获取时区,然后在登录流程中重定向(将时区作为参数传递)。

<script type="text/javascript" src="/script/detect_timezone.js"></script>
<script type="text/javascript">
var tz_info = jstz.determine_timezone();
var timezone = tz_info.timezone;
var tz_id='';
if (timezone != 'undefined') {
    timezone.ambiguity_check();
    tz_id = timezone.olson_tz;
    alert(tz_id); // olson timezone, e.g. "Europe/London", "Asia/Tokyo" etc.
}               
</script>

这比搞乱 IP 地理定位要容易得多,而且由于大多数人都将他们的计算机/设备设置为他们“正确”的时区,所以大部分时间都是正确的。

【讨论】:

    【解决方案2】:

    我不完全确定您实际上在问什么,因为我相信您可以自己回答这个问题。

    您无法直接从 http 请求中获取时区,如此处所述:

    Is there another way to get a user's time zone from a HttpServletRequest object in Spring MVC?

    但是可以通过ip地址来判断。此处提及:

    How to programmatically find geo location of incoming http request?

    您也可以使用 getTimeZoneOffset()。此处提及:

    User needs to display transaction in there local time as they login from different country.

    在注册时提示用户输入 gmt 或国家代码(并从中计算 gmt)似乎更容易。

    【讨论】:

      【解决方案3】:

      您需要先将客户端 IP 地址映射到地理位置。

      有很多数据库都有这些信息。
      例如,查看DB-IP,这是一个数据库,其中包含 IP 地址到各种位置信息的映射信息。
      您可以将数据加载到本地数据库并使用调用 IP 地址进行查询。 (当您使用 Java Servlet 时,您的 HttpRequest 中有此内容。)
      数据库的商业版本(90 美元)也包含时区。

      其他可能性包括使用网络服务,例如IP2Location。 当客户端发出请求时,您将从服务请求数据。 当然,这可能会很慢,并且您依赖于远程服务的可用性。

      周围还有其他数据库和服务,找到适合您需求的。

      我没有找到一个免费的并且里面有时区信息的。当涉及到更大的国家时,国家信息肯定是不够的。

      【讨论】:

        【解决方案4】:

        首先我们要find the Time zone of a client

        然后根据时区我们必须按如下方式获取时间:

        public String getLocalTime(String timezone) {
            TimeZone tz = TimeZone.getTimeZone(timezone);
            Calendar localtime = new GregorianCalendar(tz);
            String strLocalTime = localtime.get(Calendar.HOUR_OF_DAY) + ":"
                    + localtime.get(Calendar.MINUTE) + ":" + localtime.get(Calendar.SECOND);
            return strLocalTime;
        }
        

        【讨论】:

          猜你喜欢
          • 2011-12-20
          • 2018-11-03
          • 1970-01-01
          • 1970-01-01
          • 2012-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多