【问题标题】:Set timezone in PHP and MySQL在 PHP 和 MySQL 中设置时区
【发布时间】:2016-03-29 11:14:39
【问题描述】:

我正在制作一个应用程序,我需要使用 PHP date() 函数将日期存储在 MySQL 中。

<?php $finalize_at = date('Y-m-d H:i:s'); ?>

这些日期需要在 MySQL 中使用NOW() 函数进行比较,以返回小时差,例如:

SELECT TIMESTAMPDIFF( hour, NOW(), finalize_at ) FROM plans;

但问题是——PHP 日期函数 date('Y-m-d H:i:s') 使用 PHP 时区设置,而 NOW() 函数从 MySQL 服务器获取 MySQL 时区。

我正在尝试解决这个问题:

  1. date_default_timezone_set('Europe/Paris'); 仅适用于 PHP。
  2. date.timezone= "Europe/Paris"; 仅适用于 PHP。
  3. SELECT CONVERT_TZ(now(), 'GMT', 'MET');这个返回空。
  4. mysql&gt; SET time_zone = 'Europe/Paris'; 这会从 MySQL 的控制台抛出一个错误。

MySQL 的时区不会改变。

有没有什么方法可以更改 PHP 和 MySQL 的时区,而无需从 MySQL 控制台进行更改,或者从 php.ini 的某个位置设置时区更改,并使这些值可用于 PHP 和 MySQL。

非常感谢您的支持。

【问题讨论】:

    标签: php mysql date datetime timezone


    【解决方案1】:

    在 PHP 中:

    <?php
    define('TIMEZONE', 'Europe/Paris');
    date_default_timezone_set(TIMEZONE);
    

    对于 MySQL:

    <?php
    $now = new DateTime();
    $mins = $now->getOffset() / 60;
    $sgn = ($mins < 0 ? -1 : 1);
    $mins = abs($mins);
    $hrs = floor($mins / 60);
    $mins -= $hrs * 60;
    $offset = sprintf('%+d:%02d', $hrs*$sgn, $mins);
    
    //Your DB Connection - sample
    $db = new PDO('mysql:host=localhost;dbname=test', 'dbuser', 'dbpassword');
    $db->exec("SET time_zone='$offset';");
    

    PHP 和 MySQL 时区现在在您的应用程序中同步。无需使用php.ini 或 MySQL 控制台!

    来自article on SitePoint

    【讨论】:

    • 非常感谢您的回答,也看到了这篇文章,但是我认为这样做的工作量很大,有没有什么办法可以让它变得更容易?您可以从 php.ini 更改时区 myslq?
    • 我不认为添加几行会使您的工作更加困难!顺便说一句,您不需要去控制台进行更改,对吗? php.ini 用于 php 配置,我认为该 php 文件中没有用于 mysql 配置的方法
    • 我正在使用 CodeIgniter 框架作为数据库进行查询,并且我正在使用这些示例但显示错误,您将知道如何在 codeigniter 中应用此示例? codeigniter.com/user_guide/database/…
    • 非常感谢您,您有美好的一天,我会看到一个更简单的选择,因为 PHP 会是完美的。
    • 您可以使用$offset = date('P');跳过几个步骤
    【解决方案2】:

    只需以下两行PHP即可轻松完成。

    $tz = (new DateTime('now', new DateTimeZone('Asia/Kabul')))->format('P');
    $pdo->exec("SET time_zone='$tz';");
    

    【讨论】:

      【解决方案3】:

      我可以通过在 phpmyadmin 中编辑显示“时区”的行来从变量部分更改我的 mysql 默认时区。

      这里你也可以改变格式,更多你可以在mysql支持http://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html找到,希望对你有帮助。

      您可以为 php 和 mysql 设置相同的时区。

      【讨论】:

        【解决方案4】:

        在PDO MySQL中设置时区的最佳方法:

        如果合适,是否误用:date('P') 示例:

        new PDO('mysql:host=localhost;dbname=nametable', 
         'username', 
         'password', 
         [PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES utf8;SET time_zone = '".date('P')."'"]);
        

        【讨论】:

          【解决方案5】:

          对于 PHP 使用这个函数:

          date_default_timezone_set()
          

          MySQL:

          default-time-zone='timezone'
          

          如果您有 root 权限,您可以在运行时使用以下语句设置全局服务器时区值:

          SET GLOBAL time_zone = timezone;
          

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

          SET time_zone = timezone;
          

          【讨论】:

          • 这些值 [ default-time-zone='timezone' ] 适用于 php.ini?我可以在主机上应用这些其他选项吗?
          【解决方案6】:

          在PDO MySQL中设置时区的最佳方法:

          new PDO('mysql:host=localhost;dbname=nametable', 'username', 'password', [PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES utf8;SET time_zone = 'Europe/Rome'"]);

          【讨论】:

            【解决方案7】:

            感谢其他答案,我找到了最适合我的解决方案,只需几行代码,无需修改任何服务器配置文件。

            1) 在 PHP 中设置所需的时区:

            date_default_timezone_set('Europe/Rome');
            

            2)建立与MySql的PDO连接:

            $MySqlConnection = new PDO("mysql:host=myHost;dbname=MyDb;charset=myCharset", $myUser, $myPwd);
            

            3)在PDO资源中设置相同的时区:

             $MySqlConnection->exec("SET TIME_ZONE = '".date('P')."';");
            

            由于 MySQL 可能无法识别时区名称 Europe/Rome,因此请使用 date('P')+/-HH:mm 格式传递它。

            请务必注意,这种方法允许您管理从夏令时到冬令时的转换,反之亦然,而无需更改代码。

            【讨论】:

              猜你喜欢
              • 2015-04-16
              • 2012-08-31
              • 1970-01-01
              • 1970-01-01
              • 2012-09-21
              • 2011-08-11
              • 2011-06-27
              相关资源
              最近更新 更多