2009-04-13 20 views

Respuesta

9

Si lo está ejecutando en la máquina local, puede verificar la zona horaria configurada.
http://www.php.net/manual/en/function.date-default-timezone-get.php

hay métodos mucho mejores y más fiables a continuación, tratar de adivinar zona horaria usando GeoIP. Si te sientes con suerte, intente: 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']); 
+0

La aplicación se está ejecutando en la máquina local, pero quiero obtener la zona horaria a través de IP en el lado del servidor, no en la máquina local. –

+0

Me encantaría tener una copia local de los datos de la zona horaria GeoIP. – Jacco

10

No hay absolutamente seguro de manera de obtener la zona horaria del cliente, pero si usted tiene el cliente presentar la fecha y hora de su máquina, puede calcular que en base a lo el tiempo es relativo a 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 de GMT o (EST/DST)

+6

Las zonas horarias son bastante difíciles, ya que la mayoría de los problemas de internacionalización son. Si conoce su hora actual Y si están en horario de verano o no, puede determinar su zona horaria. Sin embargo, descifrar el significado de la luz del día es muy difícil (otra vez) – Jacco

+3

Esta es una gran idea en teoría hasta que tenga en cuenta el horario de verano. Lo que me hace querer llorar. – dudewad

+0

Esta es una gran idea. Y el horario de verano no hace la diferencia, ya que siempre almacenamos GMT en el servidor de todos modos :) – frodeborli

14

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 envíe la zona horaria, quizás en un encabezado.

Vea Tor: anonymity online por una razón más para dejar de usar las direcciones IP para cosas para las que no fueron diseñadas.

+12

A menudo, es posible que proporcione al usuario los campos de formulario completados automáticamente "mejor estimación" en cuyo caso no hay absolutamente nada de malo en esto. –

+0

No hay nada malo con qué? –

+4

Nada de malo con el uso de una ip para aproximar una zona horaria. – unflores

2

Si lo que necesita saber es la zona horaria de los usuarios que navegan por su página web, puede utilizar 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.

25

Obtenga una flota de camiones bicicletas y conduzca por todo el mundo registrando la dirección IP de todos los enrutadores inalámbricos y la coordenada 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").

+9

¿Es esta una respuesta práctica para esta pregunta? – footy

+10

depende de su empresa, supongo :) –

+0

¿Fuente? Encuentro esto muy interesante. – andychase

3

No es recta hacia adelante pero me da el tiempo que incluye desplazamiento desde 2 llamadas a la API utilizando jQuery y PHP horario de verano. Todo se podría hacer en PHP con bastante facilidad con un poco de adaptación. Estoy seguro de que esto también podría plantearse 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"}'; 
} 

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

1

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, incluida la time_zone, como puede ver a continuación.

que describen la forma de compilar la extensión PHP, y cómo utilizar las bases de datos MMDB en PHP aquí:

Intro to Maxmind GeoLite2 with Kohana PHP

enter image description here

6

No es una buena idea para buscar 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'; 
} 
0

Aquí hay un ejemplo usando un location API que asigna la dirección IP a la zona horaria, por ejemplo, envíe una solicitud al https://ipapi.co/<IP-Address>/timezone/ & regrese la zona horaria para esa dirección IP.

Código PHP

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

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

4
$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 intente con el servidor.

+0

muy útil ahorró mucho tiempo para mí –

Cuestiones relacionadas