2010-06-27 12 views
16

¿Hay alguna manera de obtener la zona horaria de un usuario por su latitud y longitud? Y no solo el desplazamiento, sino la zona horaria real en la que se encuentran.Obtener el nombre de la zona horaria de PHP de latitud y longitud?

Básicamente, estoy buscando el polo opuesto a DateTimeZone :: getLocation, que devuelve la latitud y la longitud de una zona horaria determinada.

+0

Sí, fue ... Había examinado geonames antes, pero por lo que pude ver, no dio la zona horaria actual NAME. Chico estaba equivocado y chico, me siento estúpido ahora. – Navarr

Respuesta

6

Geonames deben hacer el trabajo muy bien:

http://www.geonames.org/

También tienen una biblioteca de php.

+3

GeoNames encuentra la zona horaria para el registro más cercano en su base de datos. Si ese registro está del otro lado del borde de la zona horaria, será incorrecto. –

-1

Yahoo lugares API proporciona información de zona horaria a través de geolocalización inversa.

Échale un vistazo.

http://developer.yahoo.com/geo/placefinder/guide/requests.html

+0

yahoo dejó de admitir sus productos GPS el año pasado y le otorgó la tecnología a Nokia, no a una compañía con las mejores perspectivas para el futuro, a menos que despidan a su jefe de desarrollo plantado de Microsoft y se unan al carro de Android antes de que la compañía se agote. –

-1

Cómo trata de encontrar el punto más cercano al de la lista de todas las ubicaciones de zona horaria? Me pregunto qué tan exacto es esto?

ACTUALIZACIÓN: Finalmente, se me ocurrió este fragmento que funciona para mí. Esto funcionará bien para todas las ubicaciones, pero puede no ser exacto para las personas cercanas a las fronteras.

/** 
    * Attempts to find the closest timezone by coordinates 
    * 
    * @static 
    * @param $lat 
    * @param $lng 
    */ 
    public static function getClosestTimezone($lat, $lng) 
    { 
    $diffs = array(); 
    foreach(DateTimeZone::listIdentifiers() as $timezoneID) { 
     $timezone = new DateTimeZone($timezoneID); 
     $location = $timezone->getLocation(); 
     $tLat = $location['latitude']; 
     $tLng = $location['longitude']; 
     $diffLat = abs($lat - $tLat); 
     $diffLng = abs($lng - $tLng); 
     $diff = $diffLat + $diffLng; 
     $diffs[$timezoneID] = $diff; 

    } 

    //asort($diffs); 
    $timezone = array_keys($diffs, min($diffs)); 


    return $timezone[0]; 

    } 
+5

Esto es muy incorrecto, ya que trata a cada zona horaria con una sola latitud y latitud. No será un poco impreciso cerca de las fronteras, será terriblemente impreciso en vastas áreas del mundo. –

+1

@James D, estoy de acuerdo en que no puede confiar en esta solución si necesita una solución precisa de identificación de zona horaria, pero está totalmente bien sugerirle a un usuario que elija entre la lista de zonas horarias más cercanas a su ubicación. Encuentro que este enfoque es mejor que solo dar una gran lista de zonas horarias. – Dziamid

+0

Timezone no se basa estrictamente en LatLong, también hay consideraciones políticas involucradas. Singapur está en la misma zona horaria que Hong Kong, aunque está significativamente al oeste de Hong Kong, y aunque está en la misma longitud que Yakarta, es una hora más que Yakarta. Intentar un cálculo de zona horaria estrictamente en lat/long sin asignarlos es una mala idea. – Shreeni

0

Hice una solución de zona horaria recientemente en un hackathon de 8 horas de duración. Se arma rápidamente y me encantaría desarrollarlo más y venderlo como un producto, pero como no hay forma de hacerlo, lo abrí al my github. También hay demo, pero puede caer si alcanza los límites de recursos. Es una aplicación web gratuita en Google App Engine.

Definitivamente puede optimizar/aumentar esto aún más en wrt - tiempo de ejecución, espacio, datos - para satisfacer sus necesidades.

+0

¿Echas de menos "PHP" en la pregunta? Existe una solución mucho mejor para Python que ya está disponible: https://github.com/MrMinimal64/timezonefinder – hackel

15

Para quienes desean obtener la zona horaria a partir de código de país, latitud y longitud. (fácil de obtener si tiene un módulo geoip instalado en su servidor)

Pruebe esto, he agregado un cálculo de distancia, solo para aquellos países que tienen múltiples zonas horarias. Ah, y el código de país es un código ISO de dos letras.

// [email protected] 

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'; 
} 
//timezone for one NY co-ordinate 
echo get_nearest_timezone(40.772222,-74.164581) ; 
// more faster and accurate if you can pass the country code 
echo get_nearest_timezone(40.772222, -74.164581, 'US') ; 
+0

Esta podría ser una mejor respuesta. Tendría que hacer algunas pruebas. ¿Por qué el código de país? ¿Hay ubicaciones que están en varios países? – Navarr

+0

Buena solución. Gracias. – ineersa

+0

Genial, ... en algún momento la zona horaria es incorrecta, pero funciona correctamente cuando se usa con el código de país – rushil

2

¿Qué pasa con el tiempo Google API zona

https://developers.google.com/maps/documentation/timezone/

que se necesita latitude y longitude matriz y devuelve como esto

array(
    'dstOffset' => (int) 3600, 
    'rawOffset' => (int) -18000, 
    'status' => 'OK', 
    'timeZoneId' => 'America/New_York', 
    'timeZoneName' => 'Eastern Daylight Time' 
) 

pero hay algunos límites

La API de Google zona horaria tiene los siguientes límites: en lugar

usuarios de la API gratuita:
2.500 solicitudes por período de 24 horas.
10 solicitudes por segundo.

clientes de Maps for Business:
100.000 solicitudes por período de 24 horas.
10 solicitudes por segundo.

Cuestiones relacionadas