我有一个通过云服务提供商托管的 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;
}
}
每当我向表中插入新条目时,时间戳仍设置为云服务提供商的时区。谁能帮我看看我做错了什么?
最佳答案
您确定该字段使用的是 TIMESTAMP 类型吗? MySQL 的时间戳类型将数据存储为 UTC,并在读取数据时转换为当前 session 时区。 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 列受到 session time_zone 更改的影响。如果您需要将 DATETIME 列转换为不同的时区,那么您应该使用 CONVERT_TZ读取数据时的函数 - 您指定数据所在的时区以及您希望将其转换为的时区。
关于php - MySQL 数据库时区设置不正确 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19784155/