web-dev-qa-db-ja.com

PHPのIPアドレスを介してタイムゾーンを取得する方法

PHPのIPアドレスからタイムゾーンを取得したい。実際、クライアントマシンで実行されるアプリケーションがあります。クライアントマシンのIPアドレスがあります。ただし、各クライアントマシンのタイムゾーンを取得することはできません。

35
Devesh M

の艦隊を取得 トラック 自転車や世界中の車を運転して、全員のワイヤレスルーターのIPアドレスと現在のGPS座標を記録します。

それがGoogleのしたことです。私は冗談で言っているのではない。

更新:それに余裕がない場合は、 MaxMind GeoLite2 を使用します。これにより、IPアドレスでタイムゾーンがわかります。ローカルPHP API(「データベースリーダー」))があります。

30
Neil McGuigan
$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');

ローカルサーバーでは動作しない場合があるため、サーバーで試してください。

19
Chandrika Shah

IPアドレスは、国へのマッピングに依存することさえできません。タイムゾーンも取得したい場合は、薄い氷の上を歩いています。クライアントsendをタイムゾーンに、おそらくヘッダーで送信する方が良いでしょう。

Tor:anonymity online が設計されていないもののためにIPアドレスの使用を停止するもう1つの理由については、を参照してください。

15
John Saunders

ローカルマシンで実行している場合は、構成されたタイムゾーンを確認できます。
http://www.php.net/manual/en/function.date-default-timezone-get.php

GeoIPを使用してタイムゾーンを推測しようとするよりも、はるかに優れた信頼性の高い方法があります。運がよければ、次を試してください: 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']);  
10
vartec

クライアントのタイムゾーンを取得する絶対的な方法はありませんが、クライアントにマシンから日付と時刻を送信してもらうと、GMTとの相対的な時間に基づいて計算できます。そのため、マシンの午後7時で、GMTの午前12:00であれば、GMTまたは(EST/DST)から-5であると判断できます。

10
cgp

ユーザーはさまざまな時間にさまざまな場所から自分のアカウントにアクセスできるため、ユーザーのIPアドレスを使用してユーザーのタイムゾーンを検索することはお勧めできません。したがって、IPアドレスを介して彼のタイムゾーンを見つけることは不可能です。しかし、私は解決策を見つけようとしました、そして、ここで私のコードを与えています。コーディング手法に関する批判は高く評価されます。

<?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';
}
7
masud_moni

簡単ではありませんが、jqueryとphpを使用した2つのapi呼び出しから夏時間のオフセットを含む時間を取得します。すべてをPHPで少し適応させると非常に簡単に実行できます。これも別の方法でレイアウトできると確信していますが、時間。

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

ここに無料のキーを登録してください: http://ipinfodb.com/register.php (制限はありませんが、1秒に1つ以上のリクエストがある場合はキューに入れられます)

3
Andy Gee

知っておく必要があるのがウェブページを閲覧しているユーザーのタイムゾーンである場合、 IP2LOCATION などのサービスを使用してタイムゾーンを推測できます。ただし、altCognitoが言ったように、これはクライアントのタイムゾーンを100%正確に伝える方法ではありません。このアプローチにはいくつかの精度の問題があります。

2

Maxmind GeoLite2データベースをご覧ください。以下に示すように、time_zoneを含むほとんどのIPアドレスの大陸/国/都市と緯度/経度に関する詳細が含まれています。

PHP拡張モジュールのコンパイル方法、およびmmdbデータベースの使用方法については、PHPここで説明します。

Kohana PHPを使用したMaxmind GeoLite2の紹介

enter image description here

1
Jamie

IPアドレスをタイムゾーンにマッピングする location API を使用した例を次に示します。 https://ipapi.co/<IP-Address>/timezone/にリクエストを送信し、そのIPアドレスのタイムゾーンを取得します。

PHPコード

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

他の人が言ったように、精度は100%ではありません。

0
user