2010-06-27 17 views
16

C'è un modo per ottenere il fuso orario di un utente in base alla latitudine e alla longitudine? E non solo l'offset, ma il fuso orario effettivo in cui si trovano.Ottieni il fuso orario PHP tra Latitudine e Longitudine?

In sostanza, sto cercando l'esatto opposto di DateTimeZone :: getLocation che restituisce la latitudine e la longitudine per un determinato fuso orario.

+0

Sì, lo era .. Avevo cercato in geonames prima ma da quello che potrei dire non ha dato il NOME fuso orario effettivo. Ragazzo mi sbagliavo e ragazzo mi sento stupido ora. – Navarr

risposta

6

Geonames dovrebbero fare il lavoro bene:

http://www.geonames.org/

Hanno anche avuto una libreria PHP.

+3

GeoNames trova il fuso orario per il record più vicino nel loro database. Se quel record si trova sull'altro lato di un bordo del fuso orario, sarà sbagliato. –

-1

L'API di luoghi Yahoo fornisce informazioni sul fuso orario tramite la geolocalizzazione inversa.

Check out.

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

+0

yahoo hanno smesso di supportare i loro prodotti GPS lo scorso anno e hanno concesso in licenza la tecnologia a Nokia, non una società con le migliori prospettive per il futuro, a meno che non licenzi il loro capo dello sviluppo di Microsoft e si uniscano al carrozzone Android prima che la società esaurisca lo sperma. –

-1

Come di trovare il punto più vicino a quello della lista di tutte le sedi di fuso orario? Mi chiedo quanto è accurato questo?

UPDATE: Alla fine, ho trovato questo frammento che funziona per me. Ciò funzionerà correttamente per tutte le località, ma potrebbe non essere accurato per chi è vicino ai confini.

+5

Questo è molto scorretto, poiché considera ogni fuso orario come dotato di un'unica latitudine e latitudine. Non sarà un po 'impreciso vicino ai confini, sarà orribilmente inaccurato su vaste aree del globo. –

+1

@James D, concordo sul fatto che non è possibile fare affidamento su questa soluzione se si ha bisogno di una soluzione precisa di identificazione del fuso orario, ma è del tutto corretto suggerire a un utente di scegliere tra l'elenco di fusi orari più vicino alla sua posizione. Trovo che questo approccio sia migliore di una semplice lista di fusi orari. – Dziamid

+0

Il fuso orario non è strettamente basato su LatLong, ma sono presenti anche considerazioni politiche. Singapore si trova nello stesso fuso orario di Hong Kong, sebbene sia ad ovest di Hong Kong, e sebbene sia nella stessa longitudine di Giacarta, è un'ora avanti a Jakarta. Tentare un calcolo del fuso orario rigorosamente su lat/long senza mapparli è una cattiva idea. – Shreeni

0

Ho fatto una soluzione di timezone di recente in un hackathon di 8 ore. È rapidamente messo insieme e mi piacerebbe svilupparlo ulteriormente e venderlo come prodotto, ma poiché non c'è modo per me di farlo, l'ho aperto a my github.

C'è anche un demo ma potrebbe andare giù se colpisce i limiti delle risorse. È una webapp gratuita su Google App Engine.

È possibile ottimizzare/aumentare ulteriormente questo in termini di tempo, spazio, dati, in base alle proprie esigenze.

+0

Ti è mancato "PHP" nella domanda? C'è una soluzione molto migliore per Python già disponibile: https://github.com/MrMinimal64/timezonefinder – hackel

15

Per coloro che desiderano ottenere il fuso orario dal codice , latitudine e longitudine. (facile da ottenere se hai un modulo geoip installato sul tuo server)

Prova questo, ho aggiunto un calcolo della distanza - solo per quei paesi che ha più fusi orari. Ah e il prefisso internazionale è un codice ISO a due lettere.

// [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

Questa potrebbe essere una risposta migliore. Dovrei fare qualche test. Perché il codice del paese? Ci sono località che si trovano in più paesi? – Navarr

+0

Buona soluzione. Grazie. – ineersa

+0

Grande, ... un fuso orario errato in qualche momento, ma funziona correttamente durante l'utilizzo con il prefisso internazionale – rushil

2

per quanto riguarda Google fuso orario api

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

ci vuole latitude e longitude e restituisce serie come questo

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

ma ci sono alcuni limiti

L'API di Google fuso orario ha i seguenti limiti in atto:

utenti delle API libera:
2.500 richieste al periodo di 24 ore.
10 richieste al secondo.

Mappe per clienti commerciali:
100.000 richieste per periodo di 24 ore.
10 richieste al secondo.

Problemi correlati