如何获得用户第一次请求时的时区(最佳实践)


How to get users timezone on their first request (best practices)

我试图在他们使用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来帮助你找出你的用户是从哪里登录的