【问题标题】:MySQL database timezone isn't being set correctly - why?MySQL 数据库时区设置不正确 - 为什么?
【发布时间】:2013-11-16 00:59:58
【问题描述】:

我有一个通过云服务提供商托管的 MySQL 数据库。时区与我当地的时区不同。我正在尝试正确设置时区..

这是我想要获得与 MySQL 数据库的新连接时使用的 PHP 代码:

static function get() {
  if (self::$instance!=null) return self::$instance;

  try {
    self::$instance = new Database("mysql:host=".self::$host.";dbname=".self::$dbname, self::$user, self::$pass);
    self::$instance->exec("SET NAMES 'utf8';");  //Use utf8 encoding for special characters
    self::$instance->exec("SET time_zone = '+01:00';"); // set to local timezone   
    return self::$instance;
  }
  catch(PDOException $e) {
      print $e->getMessage();
      return null;
  }
}

每当我向表中插入新条目时,时间戳仍设置为云服务提供商的时区。谁能帮忙看看我做错了什么?

【问题讨论】:

  • 你的代码中的 $instance 是什么?!
  • 您必须在每个涉及日期的操作之前执行SET time_zone 命令。 (你可以在你的课堂上实现它。)
  • 他们是否允许访问您的“my.ini” - 我希望您可以在其中设置它?
  • 我怀疑你有访问权限,但尝试全局设置:SET GLOBAL time_zone = '+01:00';
  • 此代码包含在数据库类中。每当我进行数据库操作(例如 INSERT INTO)时,我都会从 $db = Database::get();

标签: php mysql timezone


【解决方案1】:

您确定该字段使用的是 TIMESTAMP 类型吗? MySQL 的时间戳类型将数据存储为 UTC,并在您读取数据时转换为当前会话时区。 DATETIME 类型不这样做,它没有时区信息,因此无法转换。请参阅与此主题相关的文档here

例如:

mysql> CREATE TABLE test (some_date DATETIME, created timestamp);
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO test (some_date) VALUES (NOW());
Query OK, 1 row affected (0.05 sec)

mysql> SELECT * FROM test;
+---------------------+---------------------+
| some_date           | created             |
+---------------------+---------------------+
| 2013-11-05 13:14:56 | 2013-11-05 13:14:56 |
+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> SET time_zone = '+4:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM test;
+---------------------+---------------------+
| some_date           | created             |
+---------------------+---------------------+
| 2013-11-05 13:14:56 | 2013-11-05 17:14:56 |
+---------------------+---------------------+

在上面的示例中,只有 TIMESTAMP 列受到会话 time_zone 更改的影响。如果您需要将 DATETIME 列转换为不同的时区,那么您应该在读取数据时使用 CONVERT_TZ 函数 - 您指定数据所在的时区以及您希望将其转换为的时区。

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 2017-04-28
    • 2012-01-16
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多