有人可以告诉我,PHP中是否有任何方法可以从IP地址或国家/地区名称获取时区区域('Asia / Calcutta')?
说明
我正在尝试根据他/她的国家/地区设置用户时区。我从他的IP地址获得用户国家,但我需要该国家的时区区域('亚洲/加尔各答')来检查该国家的DST是否开启。 任何人都可以在PHP中为我提供一些合适的解决方案吗?
答案 0 :(得分:5)
使用IP地址
时区有时遵循古怪的规则。 IP地理定位不是精确的(尽管有些供应商声称)。
话虽如此,您当然可以使用MaxMind的Geo IP产品找到城市和国家:
http://www.maxmind.com/app/geolite
包含PHP模块
http://www.maxmind.com/app/php
然后,您可以使用MaxMind API尝试估算用户的时区
http://www.maxmind.com/app/faq#timezone
<强>替代强>
如果您想依赖用户的时钟而不是IP地址,那么jsTimezoneDetect的效果非常好(尽管它并不完美)。
https://bitbucket.org/pellepim/jstimezonedetect/wiki/Home
<强>摘要强>
这两种技术在所有情况下都不能完美运行。请务必让您的用户更正任何自动生成的时区建议。
答案 1 :(得分:1)
我认为更好的想法是根据用户客户端设置找出设置的时区。也许存在用户处于时区的情况,他不希望这样。
一个简单的可能性就是询问用户,但这很容易。
使用JavaScript,您可以从UTC中找到offset in minutes。如果客户端位于夏令时(DST)且dst处于活动状态的国家/地区,您也可以找到。这可以通过比较两个日期对象的时间来完成,一个月份为January
,另一个月份为July
。
var dst1, dst2, expires, hemisphere, now;
now = new Date(); expires = new Date(); dst1 = new Date(); dst2 = new Date();
expires.setTime(now.getTime() + 31536000000);
setCookie('timezone_offset', now.getTimezoneOffset(), expires, '/');
dst1.setDate(1);
dst1.setMonth(1);
dst2.setDate(1);
dst2.setMonth(7);
if (parseInt(dst1.getTimezoneOffset()) === parseInt(dst2.getTimeZoneOffset())) {
setCookie('timezone_dst', 0, expires, '/');
} else {
hemisphere = parseInt(d1.getTimezoneOffset()) - parseInt(d2.getTimezoneOffset());
if ((hemisphere > 0 && parseInt(d1.getTimezoneOffset()) === parseInt(now.getTimezoneOffset())) || (hemisphere < 0 && parseInt(d2.getTimezoneOffset()) === parseInt(now.getTimezoneOffset()))) {
setCookie('timezone_dst', '0', expires, '/');
} else {
setCookie('timezone_dst', '1', expires, '/');
}
}
使用PHP阅读cookie并使用timezone_name_from_abbr()解释它们的信息:
$timezone = timezone_name_from_abbr('', $_COOKIE['timezone_offset'] * 60, $_COOKIE['timezone_dst']);
答案 2 :(得分:1)
这样你就可以获得时区..
<?php
$jsondata = file_get_contents("https://ipapi.co/json");
$data = json_decode($jsondata, true);
echo '<pre>';
print_r($data);
echo '</pre>';
//Timezone
echo $data['timezone'];
?>
//OUTPUT
Array
(
[ip] => 2405:204:f089:d0e8:b1e7:a83e:9e2d:1bb5
[city] => Bhubaneswar
[region] => Odisha
[region_code] => OR
[country] => IN
[country_name] => India
[continent_code] => AS
[postal] =>
[latitude] => 20.2333
[longitude] => 85.8333
[timezone] => Asia/Kolkata
[utc_offset] => +0530
[country_calling_code] => +91
[currency] => INR
[languages] => en-IN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc
[asn] => AS55836
[org] => Reliance Jio Infocomm Limited
)
Asia/Kolkata
答案 3 :(得分:0)
如果您想在服务器端执行此操作,可以使用PHP执行此操作:
$url = "https://ipsidekick.com/json";
$result = file_get_contents($url);
$json = json_decode($result, true);
print("It's " . $json["gmtOffset"] . " at " . $json["timeZoneName"]);
请注意,这是同步的。
或者,如果您可以在客户端进行此操作。您可以将它与jQuery或等效的一起使用:
$.get("https://ipsidekick.com/json", function(response) {
console.log(response.ip +
" It's " + response.gmtOffset +
" from " + response.timeZoneName);
});
免责声明:我运行IP Sidekick。