2009-04-13 5 views

Antwort

9

Wenn Sie es auf dem lokalen Computer ausführen, können Sie die konfigurierte Zeitzone überprüfen.
http://www.php.net/manual/en/function.date-default-timezone-get.php

Es gibt viel bessere und zuverlässigere Methoden als versuchen Zeitzone mit GeoIP zu erraten. Wenn Sie Glück haben das Gefühl, versuchen: 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

Die Anwendung läuft auf dem lokalen Rechner, aber ich möchte Zeitzone durch IP auf der Serverseite, nicht auf dem lokalen Rechner erhalten. –

+0

Ich hätte gerne eine lokale Kopie der GeoIP-Zeitzonendaten. – Jacco

10

Es gibt keine absolut bestimmte Art und Weise den Kunden Zeitzone zu bekommen, aber wenn Sie den Client das Datum und die Zeit von ihrer Maschine einreichen, können Sie es berechnen, basierend auf, was Die Zeit ist relativ zu GMT. Also, wenn es ist 7:00 Uhr auf ihrem Rechner und es ist 12:00 Uhr GMT, dann können Sie feststellen, dass sie -5 von GMT oder (EST/DST) sind

+6

Zeitzonen sind ziemlich schwierig, wie die meisten Internationalisierungsprobleme sind. Wenn Sie ihre aktuelle Zeit kennen UND wenn sie Sommerzeit haben oder nicht, dann können Sie ihre Zeitzone bestimmen. Herauszufinden, das Tageslicht sagen ist jedoch sehr schwierig (wieder) – Jacco

+3

Dies ist eine großartige Idee in der Theorie, bis Sie DST berücksichtigen. Was mich dazu bringt zu weinen. – dudewad

+0

Das ist eine großartige Idee. Und DST macht keinen Unterschied, da wir GMT sowieso immer auf dem Server speichern :) – frodeborli

14

IP-Adresse kann nicht einmal darauf verlassen, um zu einer Karte Land; Sie treten auf dünnes Eis, wenn Sie auch Zeitzone bekommen wollen. Sie sind besser dran, den Client senden Sie die Zeitzone, vielleicht in einer Kopfzeile.

Weitere Informationen finden Sie unter Tor: anonymity online, um die Verwendung von IP-Adressen für Dinge aufzuheben, für die sie nicht entwickelt wurden.

+12

Oft können Sie dem Benutzer "automatisch erraten", automatisch ausgefüllte Formularfelder zur Verfügung stellen. In diesem Fall ist absolut nichts falsch daran. –

+0

Nichts falsch mit was? –

+4

Nichts ist falsch mit der Verwendung einer IP, um eine Zeitzone anzunähern. – unflores

2

Wenn Sie die Zeitzone der Benutzer Ihrer Webseite kennen müssen, können Sie einen Dienst wie IP2LOCATION verwenden, um die Zeitzone zu erraten. Denken Sie jedoch daran, wie altCognito sagte, dies ist keine 100% genaue Art, die Zeitzone des Kunden anzugeben. Bei diesem Ansatz gibt es einige Genauigkeitsprobleme.

25

Holen Sie sich eine Flotte von LKWs Fahrräder und fahren um die Welt, die IP-Adresse und die aktuelle GPS-Koordinate jedes drahtlosen Routers protokollieren.

Das hat Google getan. Ich mache keine Witze.

Update: Wenn Sie das nicht leisten können, verwenden Sie MaxMind GeoLite2, die Ihnen die Zeitzone von IP-Adresse angibt. Es hat eine lokale PHP API (der "Datenbankleser").

+9

ist das eine praktische Antwort für diese Frage? – footy

+10

hängt von Ihrer Firma ab, denke ich :) –

+0

Quelle? Ich finde das wirklich interessant. – andychase

3

Es ist nicht gerade vorwärts, aber ich bekomme die Zeit einschließlich Sommerzeit Offset von 2 API-Anrufe mit jQuery und PHP. Alles konnte in PHP ziemlich leicht mit ein wenig Anpassung getan werden. Ich bin mir sicher, dass dies auch anders angelegt sein könnte, aber ich habe es einfach aus dem vorhandenen Code genommen, der meinen Bedürfnissen damals entsprach.

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

Register für einen kostenlosen Schlüssel hier: http://ipinfodb.com/register.php (keine Grenzen gesetzt, aber die Warteschlange gestellt, wenn mehr als 1 Anfrage pro Sekunde)

1

Überprüfen Sie die Maxmind GeoLite2-Datenbank. Es enthält Details über den Kontinent/Land/Stadt und lat/lon für die meisten IP-Adressen einschließlich der time_zone, wie Sie unten sehen können.

ich beschreiben, wie die PHP-Erweiterung zu kompilieren, und wie die mmdb Datenbanken in PHP verwenden hier:

Intro to Maxmind GeoLite2 with Kohana PHP

enter image description here

6

Es ist keine gute Idee, um die Zeitzone ein für die Suche Benutzer über seine IP-Adresse, da er von verschiedenen Orten zu unterschiedlichen Zeiten auf sein Konto zugreifen kann. Es ist also unmöglich, seine Zeitzone über die IP-Adresse zu lokalisieren. Aber ich habe versucht, eine Lösung zu finden, und ich gebe meinen Code hier. Jede Kritik an der Codierungstechnik wird sehr geschätzt.

<?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

Hier ist ein Beispiel einer location API verwenden, die IP-Adresse zu Zeitzone abbildet, z.B. Senden Sie eine Anfrage an https://ipapi.co/<IP-Address>/timezone/ & bekommen Sie Zeitzone für diese IP-Adresse zurück.

PHP-Code

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

Genauigkeit ist nicht 100% wie andere gesagt haben.

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

Irgendwann wird es nicht auf dem lokalen Server funktionieren, also versuchen Sie es auf dem Server.

+0

sehr hilfreich gespeichert eine Menge Zeit für mich –