緯度と経度でユーザーのタイムゾーンを取得する方法はありますか?そして、オフセットだけでなく、実際のタイムゾーンもあります。
基本的に、特定のタイムゾーンの緯度と経度を返すDateTimeZone :: getLocationの正反対の極を検索しています。
国コード、緯度、経度からタイムゾーンを取得したい場合。 (サーバーに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') ;
優れたリソースはGoogleタイムゾーンAPIです。
ドキュメント: https://developers.google.com/maps/documentation/timezone/
latitude
とlongitude
を取り、次のような配列を返します。
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呼び出し/月は無料です)。