我试图在他们使用Zend框架的第一个请求上获得用户的时区。目前,一旦获得时区,就将其存储到$_SESSION
变量中。
这是我的动作控制器:
public function init()
{
$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('timezone', 'html')->initContext();
}
public function timezoneAction()
{
$_SESSION['tz'] = $this->_getParam('tzName');
}
我知道实际上没有办法通过Ajax在第一次请求期间访问这个会话变量,因为JavaScript是客户端脚本,并且在第一次请求之后进行检测。也没有办法通过HTTP头获取用户的时区。
那么,如何在用户的第一个请求上获取用户的时区?geo-ip是唯一可行的解决方案吗?最佳实践是什么?谢谢。如果我没看错的话,问题是:
- 某个(新)用户正在加载页面。
- 您希望用户看到反映他们的时区的内容(可能是一些UTC时间转换成他们的时区)。
- 在第一个请求期间,服务器不知道他们的时区。
- 窟吗?
最直接的解决方案是完成所有的客户端(除非我错过了一些需求——你的问题并不完全清楚你的背景)。有服务器输出的东西在UTC,包装在一些HTML元素与一个特殊的类(如:<span class="datetime">2012-01-2 01:02:03 UTC</span>
,然后有一些javascript取代这些元素的内容与一些更友好的,本地化的,表示当地时间。
当然,JS并没有真正给你时区。它只是给你一个偏移量(通过getTimezoneOffset()),但这应该足以显示的目的,除非我忘记了一些东西(这是有可能的,因为我有一个模糊的回忆,发现这一点令人沮丧,但我认为这是因为我想要一个实际的时区,而不是偏移量,因为夏令时)。
将AJAX请求中的时间发送到服务器,并将其与服务器的时间进行比较。计算差值,然后用它来确定用户所在的时区。
你也可以使用Geo-Ip来帮助你找出你的用户是从哪里登录的