如何在PHP中通过IP地址获取时区

Dev*_*h M 36 php ip time timezone

我想通过PHP中的IP地址获取时区.实际上,我有一个将在客户机上运行的应用程序.我有客户机的IP地址.但我无法为每台客户机获取时区.

小智 21

$ip = "189.240.194.147";  //$_SERVER['REMOTE_ADDR']
$ipInfo = file_get_contents('http://ip-api.com/json/' . $ip);
$ipInfo = json_decode($ipInfo);
$timezone = $ipInfo->timezone;
date_default_timezone_set($timezone);
echo date_default_timezone_get();
echo date('Y/m/d H:i:s');
Run Code Online (Sandbox Code Playgroud)

有时它不能在本地服务器上工作,所以尝试在服务器上.


Joh*_*ers 15

甚至不能依靠IP地址映射到一个国家; 如果你还想获得时区,你就会在薄冰上行走.你最好让客户端发送时区,也许是在标题中.

请参阅Tor:匿名在线,这是另一个停止使用IP地址的原因.

  • 通常,您可能会向用户提供"最佳猜测"自动填写的表单字段,在这种情况下,这绝对没有任何问题. (12认同)
  • 使用ip来估计时区没什么错. (4认同)
  • 我同意.如果有信息可以帮助您的用户体验朝着正确的方向发展,而不会损害用户的互动,请使用它! (4认同)

var*_*tec 10

如果您在本地计算机上运行它,则可以检查配置的时区.
http://www.php.net/manual/en/function.date-default-timezone-get.php

有很多更好,更可靠的方法,然后尝试使用GeoIP猜测时区.如果您感到幸运,请尝试:http://www.php.net/manual/en/book.geoip.php

$region = geoip_region_by_name('www.example.com');
$tz = geoip_time_zone_by_country_and_region($region['country_code'],
                                            $region['region']);  
Run Code Online (Sandbox Code Playgroud)


cgp*_*cgp 10

获取客户端的时区并不是绝对肯定的,但是如果您让客户端从他们的机器上提交日期和时间,您可以根据它与GMT相关的时间来计算它.所以,如果它是在他们的机器上下午7点而且是格林尼治标准时间上午12:00,那么你可以确定它们是GMT或-5(EST/DST)

  • 时区很难,因为大多数国际化问题都是如此.如果您知道他们当前的时间以及他们是否在夏令时,那么您可以确定他们的时区.然而,弄清楚白昼的说法非常困难(再次) (6认同)
  • 理论上这是一个好主意,直​​到你考虑到DST.这让我想哭. (3认同)

mas*_*oni 7

通过他或她的IP地址搜索用户的时区不是一个好主意,因为他可以在不同的时间从不同的地方访问他或她的帐户.因此无法通过IP地址找到他的时区.但我试图找到一个解决方案,我在这里给我的代码.任何有关编码技术的批评都将受到高度赞赏.

<?php

$time_zone = getTimeZoneFromIpAddress();
echo 'Your Time Zone is '.$time_zone;

function getTimeZoneFromIpAddress(){
    $clientsIpAddress = get_client_ip();

    $clientInformation = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$clientsIpAddress));

    $clientsLatitude = $clientInformation['geoplugin_latitude'];
    $clientsLongitude = $clientInformation['geoplugin_longitude'];
    $clientsCountryCode = $clientInformation['geoplugin_countryCode'];

    $timeZone = get_nearest_timezone($clientsLatitude, $clientsLongitude, $clientsCountryCode) ;

    return $timeZone;

}

function get_client_ip() {
    $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ipaddress = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $ipaddress = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
        $ipaddress = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $ipaddress = getenv('REMOTE_ADDR');
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

function get_nearest_timezone($cur_lat, $cur_long, $country_code = '') {
    $timezone_ids = ($country_code) ? DateTimeZone::listIdentifiers(DateTimeZone::PER_COUNTRY, $country_code)
        : DateTimeZone::listIdentifiers();

    if($timezone_ids && is_array($timezone_ids) && isset($timezone_ids[0])) {

        $time_zone = '';
        $tz_distance = 0;

        //only one identifier?
        if (count($timezone_ids) == 1) {
            $time_zone = $timezone_ids[0];
        } else {

            foreach($timezone_ids as $timezone_id) {
                $timezone = new DateTimeZone($timezone_id);
                $location = $timezone->getLocation();
                $tz_lat   = $location['latitude'];
                $tz_long  = $location['longitude'];

                $theta    = $cur_long - $tz_long;
                $distance = (sin(deg2rad($cur_lat)) * sin(deg2rad($tz_lat)))
                    + (cos(deg2rad($cur_lat)) * cos(deg2rad($tz_lat)) * cos(deg2rad($theta)));
                $distance = acos($distance);
                $distance = abs(rad2deg($distance));
                // echo '<br />'.$timezone_id.' '.$distance;

                if (!$time_zone || $tz_distance > $distance) {
                    $time_zone   = $timezone_id;
                    $tz_distance = $distance;
                }

            }
        }
        return  $time_zone;
    }
    return 'unknown';
}
Run Code Online (Sandbox Code Playgroud)