web-dev-qa-db-ja.com

緯度と経度からPHPタイムゾーン名を取得しますか?

緯度と経度でユーザーのタイムゾーンを取得する方法はありますか?そして、オフセットだけでなく、実際のタイムゾーンもあります。

基本的に、特定のタイムゾーンの緯度と経度を返すDateTimeZone :: getLocationの正反対の極を検索しています。

20
Navarr

Geonamesはうまく機能するはずです:

http://www.geonames.org/

彼らはまた、phpライブラリを持っています。

5
thomasfedb

国コード、緯度、経度からタイムゾーンを取得したい場合。 (サーバーにgeoipモジュールがインストールされている場合は簡単に入手できます)

これを試してください。距離の計算を追加しました。複数のタイムゾーンを持つ国のみを対象としています。ああ、国コードは2文字のISOコードです。

// ben@jp

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') ;
16
j-bin

優れたリソースはGoogleタイムゾーンAPIです。

ドキュメントhttps://developers.google.com/maps/documentation/timezone/

latitudelongitudeを取り、次のような配列を返します。

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

...しかし、いくつかの制限があります:

[2019年更新]GoogleタイムゾーンAPIには使用制限があります。基本的に、プロジェクトで請求を有効にする必要がありますが、毎月200米ドルの「GoogleMaps Platformクレジット」が適用されます(したがって、ほとんどの場合、最初の40,000タイムゾーンAPI呼び出し/月は無料です)。

3
dav

私は最近、8時間のハッカソンでタイムゾーンソリューションを実行しました。すぐにまとめられ、さらに開発して製品として販売したいと思っていますが、それを行う方法がないため、 my github でオープンソース化しました。

demo もありますが、リソースの制限に達するとダウンする可能性があります。これは、Google AppEngineの無料のWebアプリです。

ニーズに合わせて、これをwrt(実行時間、スペース、データ)で確実に最適化/拡張できます。

0
Uddhav Kambli