7

谁能告诉我PHP中是否有任何方法可以从IP地址或国家名称中获取时区区域,例如('Asia/Calcutta')?

描述:

我正在尝试根据他/她的国家/地区设置用户时区。我从他的 IP 地址获取用户国家/地区,但我需要该国家/地区的时区区域,例如('Asia/Calcutta')来检查该国家/地区是否启用 DST。谁能给我一些合适的PHP解决方案?

4

4 回答 4

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

概括

这两种技术都不能在所有情况下完美运行。确保您允许您的用户更正任何自动生成的时区建议。

于 2012-06-27T05:09:39.530 回答
2

这样你得到时区..

<?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
于 2018-03-09T07:53:16.573 回答
1

我认为一个更好的主意是找出根据用户客户端设置设置的时区。也许存在用户处于他不想成为的时区的情况。

一种简单的可能性是询问用户,但这很容易。

使用 JavaScript,您可以在几分钟内找出与 UTC的偏移量。您还可以了解客户是否在夏令时 (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']);
于 2012-06-27T06:04:35.303 回答
1

如果您想在服务器端执行此操作,您可以使用 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

于 2017-08-28T09:10:13.867 回答