【问题标题】:TimeZone not set correctly时区设置不正确
【发布时间】:2023-04-03 04:37:01
【问题描述】:

我有一个问题,我正在将 mysql 与 PHP 一起使用,并且我的数据库中的时间戳列在当前时间戳更新时自动设置。但是,当我尝试将行插入表中时,添加的行的时间戳与我当前时间(两小时之前)不同,我有 EST 时区。

我检查了数据库的时区,它是系统,当我搜索时,我读到它取决于正在连接的机器,但我的机器有 EST 时间,所以任何人都可以解释为什么我有这个?以及如何将我的数据库的当前时间戳设置为 EST?

【问题讨论】:

  • How to set time zone of mysql? 的可能重复项
  • MySQL 默认读取系统时区。如果您需要更改它,您可以通过此处列出的命令行参数进行更改。 dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
  • 在表格中插入行时,是否使用PHP函数来设置值?例如日期();如果是这种情况,请使用 phpinfo() 检查 Web 服务器时区。
  • 我在 mysql 上中继,以便在更新时为我插入时间戳。
  • 不,这不是重复的,我想知道系统时区是什么意思?如果不是我的机器?

标签: php mysql timezone


【解决方案1】:

我个人发现在 PHP 中设置时区要可靠得多,然后在此处获取时间戳并将其传递给您的 MySQL 查询。

类似:

date_default_timezone_set('America/New_York'); 
$curtimestamp = date('Y-m-d G:i:s', time());

然后在查询中使用 $curtimestamp 的值。

【讨论】:

  • 我想知道为什么 SYSTEM 返回的时间戳与我机器上的时间戳不同?
  • 因为 MySQL 以一种奇怪的方式处理时区。请参阅上面的评论 - 我发现使用 PHP 管理时区内容要可靠得多。不过,这里有一个链接可能会在 MySQL 方面对您有所帮助。 stackoverflow.com/questions/930900/…
【解决方案2】:

文档可能不清楚。

time_zone=SYSTEM 表示 MySQL Server 时区源自运行 MySQL Server 的主机,而不是客户端系统。

因此,如果 MySQL 服务器主机上的时区与客户端主机的时区不同,则说明您观察到的行为。


每个客户端(数据库会话)都有自己的time_zone 设置。建立连接后,该设置源自 MySQL 服务器的“默认”时区。

此变量的设置决定了如何解释 DATETIME 和 TIMESTAMP 值,何时将值从客户端发送到数据库,以及何时从数据库中提取现有值。

客户端可以发出SET time_zone 语句来更改数据库会话的时区,例如

SET time_zone=CST6CDT

(请注意,要为时区使用命名值,必须填充 mysql 数据库中的 time_zone% 表。)

要设置将用于新数据库连接的“默认”时区,您可以设置“全局”时区变量:

SET GLOBAL time_zone=

(此更改需要 SUPER 权限,它会影响到整个实例的所有新数据库连接。通常,此值在 MySQL 服务器配置文件中设置。)


对于TIMESTAMP 列,MySQL 将它们存储为 UTC。返回给客户端的值取决于客户端time_zone 的设置。作为一个简单的演示:

mysql>     CREATE TABLE mytest
    ->     ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
    ->     , ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ->     );
Query OK, 0 rows affected (0.11 sec)

mysql>     SHOW VARIABLES LIKE 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | +00:00 |
+---------------+--------+
1 row in set (0.00 sec)

mysql>     INSERT INTO mytest (id) VALUES (NULL);
Query OK, 1 row affected (0.00 sec)

mysql>     SELECT * FROM mytest;
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  1 | 2015-01-09 15:41:25 |
+----+---------------------+
1 row in set (0.00 sec)

mysql>     SET time_zone = 'CST6CDT';
Query OK, 0 rows affected (0.00 sec)

mysql>     SELECT * FROM mytest;
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  1 | 2015-01-09 09:41:25 |
+----+---------------------+
1 row in set (0.00 sec)

mysql>     INSERT INTO mytest (id) VALUES (NULL);
Query OK, 1 row affected (0.00 sec)

mysql>     SELECT * FROM mytest;
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  1 | 2015-01-09 09:41:25 |
|  2 | 2015-01-09 09:41:25 |
+----+---------------------+
2 rows in set (0.00 sec)

mysql>     SET time_zone = 'EST5EDT';
Query OK, 0 rows affected (0.00 sec)

mysql>     SELECT * FROM mytest;
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  1 | 2015-01-09 10:41:25 |
|  2 | 2015-01-09 10:41:25 |
+----+---------------------+
2 rows in set (0.00 sec)

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 2012-01-16
    • 2023-03-21
    • 2013-11-16
    • 2018-06-07
    • 2020-10-17
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多