【问题标题】:MYSQL set timezone in PHP codeMYSQL在PHP代码中设置时区
【发布时间】:2012-08-31 01:53:06
【问题描述】:

如何将 MYSQL TIMEZONE 更改为 GMT 格式,就像 PHP 中的这个函数一样: /设置 GMT 时区/ date_default_timezone_set('Etc/GMT');

我的数据库课程在这里:

class DB {
    private static $instance;
    private $MySQLi;

    private function __construct(array $dbOptions){

        $this->MySQLi = @ new mysqli(   $dbOptions['db_host'],
                                        $dbOptions['db_user'],
                                        $dbOptions['db_pass'],
                                        $dbOptions['db_name'] );

        if (mysqli_connect_errno()) {
            throw new Exception('Database error.');
        }

        $this->MySQLi->set_charset("utf8");
    }

    public static function init(array $dbOptions){
        if(self::$instance instanceof self){
            return false;
        }

        self::$instance = new self($dbOptions);
    }

    public static function getMySQLiObject(){
        return self::$instance->MySQLi;
    }

    public static function query($q){
        return self::$instance->MySQLi->query($q);
    }

    public static function prepare($q){
        return self::$instance->MySQLi->prepare($q);
    }

    public static function esc($str){
        return self::$instance->MySQLi->real_escape_string(htmlspecialchars($str));
    }

}

我在其他文件中的查询是这样的:

DB::query('UPDATE `calendar_data` SET `data` = "'.DB::esc(json_encode($array)).'", `upcoming_time` = "'.date('Y-m-d H:i:s', $upcoming).'", `time_now` = NOW() WHERE `id` = "1"');

我应该将我的查询插入到类中以便运行一次?

谢谢!

$this->MySQLi->set_charset("utf8");
$this->MySQLi->query("SET timezone = 'GMT'");
  • 不工作。如果我使用 NOW(),则插入服务器时间 (GMT-4)。哪里有问题???

【问题讨论】:

  • 我强烈建议反对使用@ 字符来抑制您的错误。

标签: php mysql timezone


【解决方案1】:

尝试以下方法:

$this->MySQLi->query("SET time_zone = '+0:00'");

仅当 MySQL 数据库中的时区信息表已创建并填充时,使用命名时区才有效。

【讨论】:

    【解决方案2】:

    写完之后:

    $this->MySQLi->set_charset("utf8");
    

    也写这个:

    $this->MySQLi->query("SET timezone = 'GMT'");
    

    此时区设置将应用于该连接上发送的所有未来查询。

    另外,请确保您已在 mysql 数据库中设置区域表。

    http://dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html

    【讨论】:

    • 不起作用。如果我使用 NOW(),则插入服务器时间 (GMT-4)。哪里有问题???
    • 在您SELECT退出日期以检查插入的内容之前,您是否再次运行SET timezone?如果您使用mysql CLI 连接并运行查询,它将再次使用服务器时区。
    • set timezone 在我的 INSERT 查询之前被放置到脚本中。我试图运行这个查询: DB::query('UPDATE users_calendar_data SET data = "'.DB::esc(json_encode($array)).'", upcoming_time = "'. date('Ymd H:i:s', $upcoming).'", time_now = NOW() WHERE id = "1"');但我的 time_now 值等于服务器时间(不是 GMT)。
    • 如果您认为它位于错误的时区,这意味着您必须在某个地方SELECTing 看看您UPDATEd 的内容。您是否在该连接上设置时区?另外,您是否填充了 MySQL tzinfo 数据库?没有那个,你什么都做不了。 dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html
    • 根据 MySQL 文档,该变量被命名为“time_zone”而不是“timezone”。
    【解决方案3】:

    来自手册;

    每个连接的时区。每个连接的客户端都有自己的时区设置,由会话 time_zone 变量给出。最初,会话变量从全局 time_zone 变量中获取其值,但客户端可以使用以下语句更改自己的时区:

    mysql> SET time_zone = timezone;
    

    所以一定是这样的;

    $this->MySQLi->query("SET time_zone = 'GMT'");
    

    http://dev.mysql.com/doc/refman/5.5/en//time-zone-support.html
    http://dev.mysql.com/doc/refman/5.5/en//server-system-variables.html#sysvar_time_zone

    【讨论】:

      【解决方案4】:

      MySQL 有大量的timezone support。您可以在服务器级别、每个连接甚至每个查询上设置它。我认为在 __construct 中执行 'SET time_zone = xxx' 对你来说已经足够了。

      【讨论】:

        猜你喜欢
        • 2016-03-29
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        • 2018-12-24
        相关资源
        最近更新 更多