2010-06-27 8 views
16

Gibt es eine Möglichkeit, die Zeitzone eines Benutzers durch ihren Breiten- und Längengrad zu erhalten? Und nicht nur der Offset, sondern die tatsächliche Zeitzone, in der sie sich befinden.PHP Zeitzone Name aus Breite und Länge?

Im Wesentlichen suche ich nach dem Gegenpol von DateTimeZone :: getLocation, das den Breiten- und Längengrad für eine bestimmte Zeitzone zurückgibt. schön

+0

Ja es war .. ich hatte schon vorher in geonames nachgeschaut aber von dem was ich sagen konnte gab es nicht den eigentlichen NAME NAME. Junge war ich falsch und Junge fühle ich mich jetzt dumm. – Navarr

Antwort

6

Geonames sollte die Arbeit machen:

http://www.geonames.org/

Sie haben auch eine PHP-Bibliothek.

+3

GeoNames findet die Zeitzone für den nächsten Datensatz in ihrer Datenbank. Wenn sich dieser Datensatz auf der anderen Seite einer Zeitzonengrenze befindet, ist dies falsch. –

-1

Die Yahoo-Orts-API liefert Zeitzoneninformationen über die umgekehrte Geolokalisierung.

Überprüfen Sie es.

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

+0

yahoo stoppte die Unterstützung ihrer GPS-Produkte im letzten Jahr und lizensierte die Technologie an Nokia, nicht ein Unternehmen mit den besten Aussichten für die Zukunft, außer sie feuern ihre Microsoft gepflanzt Entwicklungschef und dem Android-Zug, bevor das Unternehmen aus spunk läuft. –

-1

Wie über den nächsten Punkt der in der Liste aller Zeitzone Standorte zu finden? Ich frage mich, wie genau das ist?

UPDATE: Schließlich kam ich mit diesem Schnipsel, der für mich funktioniert. Dies wird für alle Standorte funktionieren, aber möglicherweise nicht für diejenigen, die in der Nähe von Grenzen sind.

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

Dies ist sehr falsch, da jede Zeitzone mit einem einzelnen Breiten- und Breitengrad behandelt wird. Es wird nicht in der Nähe von Grenzen ein bisschen ungenau sein, es wird furchtbar ungenau über weite Teile des Globus sein. –

+1

@James D, Ich stimme zu, dass Sie sich nicht auf diese Lösung verlassen können, wenn Sie eine genaue Lösung der Zeitzonenidentifizierung benötigen, aber es ist völlig in Ordnung, einem Benutzer zu empfehlen, aus der Liste der Zeitzonen zu wählen. Ich finde diesen Ansatz besser als nur eine riesige Liste von Zeitzonen zu geben. – Dziamid

+0

Zeitzone basiert nicht streng auf LatLong, es gibt auch politische Überlegungen. Singapur liegt in der gleichen Zeitzone wie Hongkong, obwohl es deutlich westlich von Hongkong liegt, und obwohl es in der gleichen Länge wie Jakarta liegt, ist es eine Stunde vor Jakarta. Es ist eine schlechte Idee, eine Zeitzonenberechnung strikt auf lat/long zu versuchen, ohne sie zu kartieren. – Shreeni

0

Ich habe kürzlich eine Zeitzone Lösung in einem 8 Stunden langen Hackathon. Es ist schnell zusammen und ich würde es gerne weiter entwickeln und es als Produkt verkaufen, aber da es für mich keine Möglichkeit gibt, es zu tun, habe ich es unter my github geöffnet.

Es gibt auch eine demo, aber es kann untergehen, wenn es Ressourcengrenzen trifft. Es ist eine kostenlose Webapp in Google App Engine.

Sie können dies definitiv weiter optimieren/erweitern - Laufzeit, Speicherplatz, Daten - ganz nach Ihren Bedürfnissen.

+0

Haben Sie "PHP" in der Frage vermisst? Es gibt eine viel bessere Lösung für Python bereits verfügbar: https://github.com/MrMinimal64/timezonefinder – hackel

15

Für diejenigen, die Zeitzone von Ländercode, Längen- und Breitengrad erhalten möchten. (leicht zu bekommen, wenn Sie ein GeoIP-Modul auf Ihrem Server installiert haben)

Versuchen Sie dies, ich habe eine Entfernungsberechnung hinzugefügt - nur für die Länder, die mehrere Zeitzonen hat. Ah, und der Ländercode ist ein zweibuchstabiger ISO-Code.

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

Dies könnte eine bessere Antwort sein. Ich müsste ein paar Tests machen. Warum die Ländervorwahl überhaupt? Gibt es Standorte in mehreren Ländern? – Navarr

+0

Gute Lösung. Vielen Dank. – ineersa

+0

Großartig, ... einige Zeit falsche Zeitzone, aber funktioniert genau mit der Verwendung von Ländercode – rushil

2

Was ist Google Zeitzone api

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

es latitude und longitude und gibt Array wie diese

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

aber es gibt einige Grenzen

nimmt

Die Google-Zeitzone API hat folgende Grenzwerte anstelle:

Nutzer des kostenlosen API:
2.500 Anfragen pro 24-Stunden-Zeitraum.
10 Anfragen pro Sekunde.

Karten für Geschäftskunden:
100.000 Anfragen pro 24 Stunden.
10 Anfragen pro Sekunde.