rastrear geolocalizacion geoip_record_by_name geoip_country_code_by_name con php time timezone ip

geolocalizacion - Cómo obtener la zona horaria a través de la dirección IP en PHP



php geoip_record_by_name (10)

Aquí hay un ejemplo que usa una API de ubicación que asigna la dirección IP a la zona horaria, por ejemplo, envía una solicitud a https://ipapi.co/<IP-Address>/timezone/ y recupera la zona horaria de esa dirección IP.

Código PHP

file_get_contents(''https://ipapi.co/1.2.3.4/timezone/'');

La precisión no es del 100%, como otros han dicho.

Quiero obtener zona horaria a través de una dirección IP en PHP. En realidad, tengo una aplicación que se ejecutará en la máquina del cliente. Tengo la dirección IP de la máquina del cliente. Pero no puedo obtener la zona horaria para cada máquina cliente.


Consulte la base de datos Maxmind GeoLite2. Contiene detalles sobre el continente / país / ciudad y lat / lon para la mayoría de las direcciones IP, incluido el time_zone, como puede ver a continuación.

Describo cómo compilar la extensión de PHP y cómo usar las bases de datos de mmdb en PHP aquí:

Introducción a Maxmind GeoLite2 con Kohana PHP


No es sencillo, pero obtengo el tiempo que incluye la compensación del horario de verano de 2 llamadas a API usando jquery y php. Todo se podría hacer en PHP con bastante facilidad con un poco de adaptación. Estoy seguro de que esto podría ser planteado de manera diferente, pero acabo de obtenerlo del código existente que se ajustaba a mis necesidades en ese momento.

Jquery / php:

function get_user_time(){ var server_time = <? echo time(); ?>; //accuracy is not important it''s just to let google know the time of year for daylight savings time $.ajax({ url: "locate.php", dataType: "json", success: function(user_location) { if(user_location.statusCode=="OK"){ $.ajax({ url: "https://maps.googleapis.com/maps/api/timezone/json?location="+user_location.latitude+","+user_location.longitude+"&timestamp="+server_time+"&sensor=false", dataType: "json", success: function(user_time) { if(user_time.statusCode=="error"){ //handle error }else{ user_time.rawOffset /= 3600; user_time.dstOffset /= 3600; user_real_offset = user_time.rawOffset+user_time.dstOffset+user_time.utc; //do something with user_real_offset } } }); } } }); }

locate.php

function get_client_ip() { $ipaddress = ''''; if ($_SERVER[''HTTP_CLIENT_IP'']) $ipaddress = $_SERVER[''HTTP_CLIENT_IP'']; else if($_SERVER[''HTTP_X_FORWARDED_FOR'']) $ipaddress = $_SERVER[''HTTP_X_FORWARDED_FOR'']; else if($_SERVER[''HTTP_X_FORWARDED'']) $ipaddress = $_SERVER[''HTTP_X_FORWARDED'']; else if($_SERVER[''HTTP_FORWARDED_FOR'']) $ipaddress = $_SERVER[''HTTP_FORWARDED_FOR'']; else if($_SERVER[''HTTP_FORWARDED'']) $ipaddress = $_SERVER[''HTTP_FORWARDED'']; else if($_SERVER[''REMOTE_ADDR'']) $ipaddress = $_SERVER[''REMOTE_ADDR'']; else $ipaddress = ''UNKNOWN''; return $ipaddress; } $location = file_get_contents(''http://api.ipinfodb.com/v3/ip-city/?key=xxxxxxxxx&ip=''.get_client_ip().''&format=json''); $location = json_decode($location,true); if(is_array($location)){ date_default_timezone_set(''UTC''); $location[''utc''] = time(); echo json_encode($location); }else{ echo ''{"statusCode":"error"}''; }

Regístrese para obtener una clave gratuita aquí: http://ipinfodb.com/register.php (sin límites, pero en cola si hay más de 1 solicitud por segundo)


No es una buena idea buscar en la zona horaria de un usuario a través de su dirección IP, ya que puede acceder a su cuenta desde diferentes lugares en diferentes momentos. Por lo tanto, es imposible ubicar su zona horaria a través de una dirección IP. Pero he tratado de encontrar una solución y estoy dando mi código aquí. Cualquier crítica sobre la técnica de codificación será muy apreciada.

<?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''; }


No hay una forma absolutamente segura de obtener la zona horaria del cliente, pero si el cliente envía la fecha y la hora desde su máquina, puede calcularla en función de la hora en relación con GMT. Entonces, si son las 7:00 p.m. en su máquina y son las 12:00 a.m. GMT, puede determinar que son -5 desde GMT o (EST / DST)


No se puede confiar en que la dirección IP se asigne a un país; estás pisando hielo fino si también quieres tener zona horaria. Es mejor que el cliente le envíe el huso horario, quizás en un encabezado.

Ver Tor: anonimato en línea por una razón más para dejar de usar direcciones IP para cosas para las que no fueron diseñados.


Obtenga una flota de camiones de bicicletas y conduzca por todo el mundo registrando la dirección IP de todos los enrutadores inalámbricos y la coordinación GPS actual.

Eso es lo que hizo Google. No estoy bromeando.

Actualización: si no puede pagar eso, use MaxMind GeoLite2 , que le indica la zona horaria por dirección IP. Tiene una API PHP local (el "lector de base de datos").



Si lo que necesita saber es la zona horaria de los usuarios que navegan por su página web, puede usar algún servicio como IP2LOCATION para adivinar la zona horaria. Sin embargo, tenga en cuenta que, como dijo altCognito, esta no es una forma 100% precisa de indicar la zona horaria del cliente. Hay algunos problemas de precisión con este enfoque.


$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'');

En algún momento no funcionará en el servidor local, así que prueba el servidor.