我正在使用Zend_Framework编写应用程序(因此解决方案可以依赖它)。
如何获得客户的时区?
例如,如果有人在俄罗斯莫斯科,我想获得3 * 60 * 60(因为有UTC + 3)。如果他在英国,我想要零。如果他使用UTC-3:30(加拿大?),我想要-3.5 * 60 * 60。
(这不是关于格式的问题 - 我对俄罗斯圣彼得堡的'欧洲/莫斯科'或'UTC-3'感到满意,而是让时区客户使用它。但是以秒为单位的delta是首选)
我想到的唯一解决方案是让javascript获取本地时间并重定向。
答案 0 :(得分:10)
我使用jQuery和PHP编写了一个函数。这已经过测试,确实有效!
在您希望将时区作为变量的PHP页面上,在页面顶部附近放置一段代码:
<?php
session_start();
$timezone = $_SESSION['time'];
?>
这将读取会话变量“time”,我们现在要创建它。
在同一页面上,您需要首先包含jQuery:
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
同样在jQuery下面,粘贴这个:
<script type="text/javascript">
$(document).ready(function() {
if("<?php echo $timezone; ?>".length==0){
var visitortime = new Date();
var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
$.ajax({
type: "GET",
url: "http://domain.com/timezone.php",
data: 'time='+ visitortimezone,
success: function(){
location.reload();
}
});
}
});
</script>
您可能已经注意到或未注意到,但您需要将网址更改为您的实际域名。
最后一件事。你可能想知道什么是timezone.php。嗯,这只是这个: (创建一个名为 timezone.php 的新文件,并使用上述网址指向该文件)
<?php
session_start();
$_SESSION['time'] = $_GET['time'];
?>
如果这样可以正常工作,它将首先加载页面,执行JavaScript并重新加载页面。然后,您将能够阅读$ timezone变量并将其用于您的乐趣!它返回当前的UTC / GMT时区偏移量(GMT -7)或您所在的任何时区。
答案 1 :(得分:8)
通过设置包含客户端时区的JavaScript的Cookie来查看 this article on how to detect the timezone 。它相当长,但那是因为它非常冗长。我已经在我自己的一个应用程序中实现了这些方面的解决方案,并且它运行良好。
您还可以通过Ajax将时区发送到服务器,并让它随时执行您需要的任何操作。或者,如果您没有使用它进行任何服务器端计算,只需在需要的地方应用时区客户端。真的取决于你的用例。
除此之外,我建议你让访问者自己设置他的时区并将其存储在Cookie或会话中。
答案 2 :(得分:2)
这是一个开销非常小的cookie解决方案:
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'));
答案 3 :(得分:-1)
我认为您最好的选择是根据客户端发送的Accept-Language
标头进行猜测。