我需要根据他们的 IP 或 http 标头知道我的用户当前所在的时区。
我得到了很多关于这个问题的答案,但我无法理解这些答案。有人说使用-new Date().getTimezoneOffset()/60
(从这里)。但是这是什么意思?
date_default_timezone_set("Asia/Calcutta");
我的 (index.php) 页面的根目录中有一个。因此,为此我必须动态获取时区并将其设置为Asia/Calcutta
.
我需要根据他们的 IP 或 http 标头知道我的用户当前所在的时区。
我得到了很多关于这个问题的答案,但我无法理解这些答案。有人说使用-new Date().getTimezoneOffset()/60
(从这里)。但是这是什么意思?
date_default_timezone_set("Asia/Calcutta");
我的 (index.php) 页面的根目录中有一个。因此,为此我必须动态获取时区并将其设置为Asia/Calcutta
.
总结马特约翰逊在代码方面的回答:
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
$(document).ready(function(){
var tz = jstz.determine(); // Determines the time zone of the browser client
var timezone = tz.name(); //For e.g.:"Asia/Kolkata" for the Indian Time.
$.post("url-to-function-that-handles-time-zone", {tz: timezone}, function(data) {
//Preocess the timezone in the controller function and get
//the confirmation value here. On success, refresh the page.
});
});
</script>
浏览器的时区信息不是 HTTP 规范的一部分,因此您不能仅从标头中获取它。
如果您有位置坐标(例如来自移动设备 GPS),那么您可以使用以下方法之一找到时区。然而,通过 IP 地址进行地理定位并不是一个很好的解决方案,因为 IP 通常是 ISP 或代理服务器的 IP,它们可能位于另一个时区。
您可以使用一些策略来尝试检测时区,例如使用jsTimeZoneDetect库,这是一个很好的起点,但不够完善,您不能仅依靠它。如果您使用的是 moment.js,则在 moment-timezone 中有一个内置函数moment.tz.guess()
可以执行相同的操作。
使用 JavaScriptgetTimezoneOffset()
函数的想法有缺陷,因为您没有获得时区 - 只是特定日期的单个偏移量。请参阅TimeZone 标签 wiki的标题为“TimeZone != Offset”的部分。
不管你怎么看,最终你必须决定两种方法之一:
或者
我在这个答案中更详细地讨论了这个问题(从 ac# 的角度)。
依赖项:
http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
//Get remote IP
$ip = $_SERVER['REMOTE_ADDR'];
//Open GeoIP database and query our IP
$gi = geoip_open("GeoLiteCity.dat", GEOIP_STANDARD);
$record = geoip_record_by_addr($gi, $ip);
//If we for some reason didnt find data about the IP, default to a preset location.
if(!isset($record)) {
$record = new geoiprecord();
$record->latitude = 59.2;
$record->longitude = 17.8167;
$record->country_code = 'SE';
$record->region = 26;
}
//Calculate the timezone and local time
try {
//Create timezone
$user_timezone = new DateTimeZone(get_time_zone($record->country_code, ($record->region!='') ? $record->region : 0));
//Create local time
$user_localtime = new DateTime("now", $user_timezone);
$user_timezone_offset = $user_localtime->getOffset();
}
//Timezone and/or local time detection failed
catch(Exception $e) {
$user_timezone_offset = 7200;
$user_localtime = new DateTime("now");
}
echo 'User local time: ' . $user_localtime->format('H:i:s') . '<br/>';
echo 'Timezone GMT offset: ' . $user_timezone_offset . '<br/>';
引文:SGet 访问者本地时间、日出和日落时间通过 IP 与 MaxMind GeoIP 和 PHP 由 Stanislav Khromov
一种解决方法是问他们!特别是在您可以捕获/注册用户的会员系统上 - 给他们一个选择。简单但准确。
这工作正常...
echo <<<EOE
<script type="text/javascript">
if (navigator.cookieEnabled)
document.cookie = "tzo="+ (- new Date().getTimezoneOffset());
</script>
EOE;
if (!isset($_COOKIE['tzo'])) {
echo <<<EOE
<script type="text/javascript">
if (navigator.cookieEnabled) document.reload();
else alert("Cookies must be enabled!");
</script>
EOE;
die();
}
$ts = new DateTime('now', new DateTimeZone('GMT'));
$ts->add(DateInterval::createFromDateString($_COOKIE['tzo'].' minutes'));