【问题标题】:How to find timezone ID from IP address/country name in PHP?如何从 PHP 中的 IP 地址/国家名称中查找时区 ID?
【发布时间】:2012-06-28 11:55:46
【问题描述】:

谁能告诉我PHP中是否有任何方法可以从IP地址或国家名称获取时区区域,例如('Asia/Calcutta')?

说明:

我正在尝试根据他/她的国家/地区设置用户时区。我从他的 IP 地址获取用户国家/地区,但我需要该国家/地区的时区区域,例如('Asia/Calcutta')来检查该国家/地区是否启用 DST。 谁能给我一些合适的PHP解决方案?

【问题讨论】:

    标签: php timezone


    【解决方案1】:

    这样你得到时区..

    <?php
    $jsondata = file_get_contents("https://ipapi.co/json");
    $data = json_decode($jsondata, true);
    echo '<pre>';
    print_r($data);
    echo '</pre>';
    
    //Timezone
    echo $data['timezone'];
    ?>
    
    //OUTPUT
    Array
    (
        [ip] => 2405:204:f089:d0e8:b1e7:a83e:9e2d:1bb5
        [city] => Bhubaneswar
        [region] => Odisha
        [region_code] => OR
        [country] => IN
        [country_name] => India
        [continent_code] => AS
        [postal] => 
        [latitude] => 20.2333
        [longitude] => 85.8333
        [timezone] => Asia/Kolkata
        [utc_offset] => +0530
        [country_calling_code] => +91
        [currency] => INR
        [languages] => en-IN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc
        [asn] => AS55836
        [org] => Reliance Jio Infocomm Limited
    )
    
    Asia/Kolkata
    

    【讨论】:

      【解决方案2】:

      如果你想在服务器端做,你可以用 PHP 做:

      $url = "https://ipsidekick.com/json";
      $result = file_get_contents($url);
      $json = json_decode($result, true);
      print("It's " . $json["gmtOffset"] . " at " . $json["timeZoneName"]);
      

      注意这是同步的。

      或者,如果您可以在客户端执行此操作。您可以将其与 jQuery 或等效项一起使用:

      $.get("https://ipsidekick.com/json", function(response) {
        console.log(response.ip +
          " It's " + response.gmtOffset +
          " from " + response.timeZoneName);
      });
      

      免责声明:我运行IP Sidekick

      【讨论】:

        【解决方案3】:

        我认为更好的办法是根据用户客户端设置找出设置的时区。可能存在用户处于他不想处于的时区的情况。

        一种简单的可能性是询问用户,但这很容易。

        使用 JavaScript,您可以找到来自 UTC 的 offset in minutes。您还可以了解客户是否在夏令时 (DST) 的国家/地区以及 dst 是否处于活动状态。这可以通过比较两个日期对象的时间来完成,一个与月份January,一个与月份July

        var dst1, dst2, expires, hemisphere, now;
        
        now = new Date(); expires = new Date(); dst1 = new Date(); dst2 = new Date();
        
        expires.setTime(now.getTime() + 31536000000);
        setCookie('timezone_offset', now.getTimezoneOffset(), expires, '/');
        
        dst1.setDate(1);
        dst1.setMonth(1);
        dst2.setDate(1);
        dst2.setMonth(7);
        
        if (parseInt(dst1.getTimezoneOffset()) === parseInt(dst2.getTimeZoneOffset())) {
          setCookie('timezone_dst', 0, expires, '/');
        } else {
          hemisphere = parseInt(d1.getTimezoneOffset()) - parseInt(d2.getTimezoneOffset());
          if ((hemisphere > 0 && parseInt(d1.getTimezoneOffset()) === parseInt(now.getTimezoneOffset())) || (hemisphere < 0 && parseInt(d2.getTimezoneOffset()) === parseInt(now.getTimezoneOffset()))) {
            setCookie('timezone_dst', '0', expires, '/');
          } else {
            setCookie('timezone_dst', '1', expires, '/');
          }
        }
        

        用PHP读取cookie并用timezone_name_from_abbr()解释它们的信息:

        $timezone = timezone_name_from_abbr('', $_COOKIE['timezone_offset'] * 60, $_COOKIE['timezone_dst']);
        

        【讨论】:

        【解决方案4】:

        使用 IP 地址

        时区有时遵循一些古怪的规则。 IP 地理位置绝非精确(尽管某些供应商声称)。

        话虽如此,您当然可以使用 MaxMind 等 Geo IP 产品找到城市和国家:

        http://www.maxmind.com/app/geolite

        其中包含一个 PHP 模块

        http://www.maxmind.com/app/php

        然后您可以使用 MaxMind API 来尝试估计用户的时区

        http://www.maxmind.com/app/faq#timezone

        替代方案

        如果您想依赖用户的时钟而不是 IP 地址,jsTimezoneDetect 可以很好地工作(尽管它并不完美)。

        https://bitbucket.org/pellepim/jstimezonedetect/wiki/Home

        总结

        这两种技术都不能在所有情况下都完美地发挥作用。确保您允许您的用户更正任何自动生成的时区建议。

        【讨论】:

        • Maxmind 链接将您带到有关其所有产品的通用常见问题解答页面 - 时区常见问题解答条目似乎已被删除。
        猜你喜欢
        • 1970-01-01
        • 2020-05-20
        • 1970-01-01
        • 2014-03-19
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 2013-11-05
        相关资源
        最近更新 更多