应用多个时区的最佳方法是什么?

时间:2013-03-22 06:11:58

标签: php codeigniter timezone

我正在努力在Codeigniter(2.0)中应用会话基准时区。

情景:

用户登录系统后,我使用lat / lon检测时区ID并将其设置为会话变量,然后将set_timezone()调用到每个控制器的构造函数中。

Ex一个自动加载的帮助文件:

function set_timezone($timeZoneId='')
{
  if($timeZoneId!="")
  {
    date_default_timezone_set($timeZoneId);
    mysql_query("SET SESSION time_zone = '".$timeZoneId."'");
  }
}

我的问题是我不想将set_timezone()调用到每个控制器的构造函数中。我想要的是全局调用而不是每个控制器的构造函数。

4 个答案:

答案 0 :(得分:4)

您应该创建一个名为MY_Controller的父控制器,其他所有控制器都会扩展。在该类的构造函数中,您可以调用set_timezone。使用此解决方案,将在所有子控制器中自动设置时区。

您的MY_Controller应存储在application/core中,并且应该如下所示:

class MY_Controller extends CI_Controller
{
  function __construct()
  {
    parent::__construct();
    $this->set_timezone();
  }

  function set_timezone($timeZoneId='')
  {
    // Your code
  }
}

现在,所有其他控制器都应该扩展MY_Controller而不是CI_Controller。 E.g:

class WelcomeController extends MY_Controller
{
  function __construct()
  {
    // This will call the constructor of MY_Controller,
    // which in turn sets the timezone:
    parent::__construct();
  }

  // Rest of your functions...
}

答案 1 :(得分:0)

另一种方式是,

您可以在Library中定义它。您可以创建库并在库中定义此函数,并在应用程序中的任何位置调用它。不要忘记在AutoLoad中加载库。

答案 2 :(得分:0)

正如Nikitas所说,创建一个如下所示的库文件,并在autoload.phpb中包含库文件

   class Timezoneconvert
   {
       function set_timezone($timeZoneId='')   {
            $this->obj =& get_instance();
            $this->obj->load->database();
          if($timeZoneId!="")
            date_default_timezone_set($timeZoneId);
            $this->obj->db->query("SET SESSION time_zone = '".$timeZoneId."'");
          }
    }
   }
autoload.php中的

$autoload['libraries'] = array('Timezoneconvert');

答案 3 :(得分:0)

我通过使用钩子获得了解决方案。 1.启用配置中的挂钩 2.将它设置为hooks.php

class HookMyHandler {
    function post_controller_constructor() {
        $this->ci = & get_instance();


        //my method name


    }
}