PHP IP Adresi ile Time Zone almak nasıl

7 Cevap php

PHP IP adresi aracılığıyla zaman dilimini almak istiyorum. Aslında ben istemci makine çalışacak bir uygulama var. Ben istemci makine IP adresi var. Ama her istemci makine için zaman dilimini almak mümkün değil.

7 Cevap

trucks bisiklet filosu almak ve herkesin kablosuz router ip adresi ve güncel GPS koordine günlüğü dünyada sürücü.

İşte Google ne yaptığını. Şaka yapmıyorum.

Bunu göze alamaz, IP adresine göre size zaman dilimini anlatan, MaxMind GeoLite2 kullanın. Bu bir yerel PHP API ("veritabanı okuyucu") vardır.

IP adresi bir ülke bile eşlemek dayanıyordu olamaz; Ayrıca dilimini almak istiyorsanız eğer ince buz basıyorsun. Sen bir başlık belki müşteri send Eğer zaman dilimi, olması daha iyi.

Tor: anonymity online onlar için tasarlanmış değildi şeyler için IP adreslerini kullanarak durdurmak için başka bir neden için bkz.

If you're running it on the local machine, you can check the configured timezone.
http://www.php.net/manual/en/function.date-default-timezone-get.php

Orada çok daha iyi ve daha güvenilir yöntemleri sonra GeolP kullanarak dilimini tahmin etmeye çalışıyorum. Eğer şanslı hissediyor iseniz, deneyin: 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']);

Orada müşterinin dilimini almak için hiçbir kesinlikle emin yolu, ancak müşteri kendi makineden tarih ve saati göndermek varsa, sefer GMT göreli ne dayalı olarak hesaplayabiliriz. Onların makinede 07:00 ve o 12:00 GMT eğer öyleyse, o zaman onlar -5 GMT veya (EST / DST) belirleyebilirsiniz

It's not straight forward but I get the time including daylight saving offset from 2 api calls using jquery and php. All of it could be done in PHP quite easily with a bit of adaptation. I'm sure this could be laid out differently too but I just grabbed it from existing code which suited my needs at the time.

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

Burada ücretsiz anahtarını kaydettirmek: http://ipinfodb.com/register.php (hiçbir sınırlama ancak kuyruğa eğer fazla 1 saniyede istek)

Ne bilmeniz gereken web sayfanızı gezen kullanıcılar zaman dilimi ise, o zaman IP2LOCATION dilimini tahmin etmek gibi bazı hizmetini kullanabilirsiniz. AltCognito dediği gibi, bu müşterinin zaman dilimini anlatan bir% 100 doğru bir yol değildir, olsa tutun. Bu yaklaşımla bazı doğruluk sorunlar vardır.

Maxmind GeoLite2 veritabanına bir göz atın. Bu da dahil olmak üzere çoğu IP adresleri için kıta / ülke / şehir ve enlem / boylam ilgili ayrıntıları içeren time_zone aşağıda görebilirsiniz.

Ben PHP uzantısı derlemek nasıl tarif, ve burada nasıl PHP MMDB veritabanları kullanmak için:

Intro to Maxmind GeoLite2 with Kohana PHP

enter görüntü açıklaması here