有没有办法通过纬度和经度获取用户的时区?不只是偏移,而是它们所处的实际时区。
基本上,我正在搜索DateTimeZone :: getLocation的极性,它返回某个时区的纬度和经度。
答案 0 :(得分:15)
对于想要从国家/地区代码,纬度和经度获取时区的用户。 (如果您的服务器上安装了geoip模块,则很容易获得)
试试这个,我添加了一个距离计算 - 仅适用于那些有多个时区的国家/地区。 啊,国家代码是两个字母的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') ;
答案 1 :(得分:6)
答案 2 :(得分:3)
一个很好的资源是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美元和#34; Google Maps Platform信用卡&#34;每月应用(因此在大多数情况下,您的前40,000个时区API调用/月将是免费的)。
答案 3 :(得分:0)
我最近在长达8小时的黑客马拉松中做了一个时区解决方案。它很快被整合在一起,我很乐意将它进一步发展并作为产品出售,但由于我无法做到这一点,我已经在my github开源了。
也有demo但如果达到资源限制可能会下降。它是Google App Engine上的免费网络应用程序。
您可以在wrt中进一步优化/扩充 - 运行时间,空间,数据 - 以满足您的需求。
答案 4 :(得分:-1)
Yahoo places API通过反向地理位置提供时区信息。
检查出来。
http://developer.yahoo.com/geo/placefinder/guide/requests.html
答案 5 :(得分:-2)
如何找到所有时区位置列表中距离最近的点?我想知道这有多准确吗?
更新: 最后,我想出了适合我的这个片段。这适用于所有位置,但对于靠近边界的人可能不准确。
/**
* Attempts to find the closest timezone by coordinates
*
* @static
* @param $lat
* @param $lng
*/
public static function getClosestTimezone($lat, $lng)
{
$diffs = array();
foreach(DateTimeZone::listIdentifiers() as $timezoneID) {
$timezone = new DateTimeZone($timezoneID);
$location = $timezone->getLocation();
$tLat = $location['latitude'];
$tLng = $location['longitude'];
$diffLat = abs($lat - $tLat);
$diffLng = abs($lng - $tLng);
$diff = $diffLat + $diffLng;
$diffs[$timezoneID] = $diff;
}
//asort($diffs);
$timezone = array_keys($diffs, min($diffs));
return $timezone[0];
}