Php 时区设置不正确

Php 时区设置不正确,php,mysql,timezone,Php,Mysql,Timezone,我有一个问题,我在PHP中使用mysql,我的数据库中有时间戳列,这些列在更新时根据当前时间戳自动设置。但是当我试图在表中插入行时,这些行添加了与我当前时间(两小时之前)不同的时间戳,我有EST时区 我已经检查了数据库的时区,它是系统,当我搜索时,我读到它依赖于正在连接的机器,但我的机器有最短的时间,所以有人能解释为什么我有这个吗?我能做些什么来将数据库的当前时间戳设置为EST?我个人发现用PHP设置时区更可靠,然后在那里获取时间戳并将其传递给MySQL查询 比如: date_default_t

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


我已经检查了数据库的时区,它是系统,当我搜索时,我读到它依赖于正在连接的机器,但我的机器有最短的时间,所以有人能解释为什么我有这个吗?我能做些什么来将数据库的当前时间戳设置为EST?

我个人发现用PHP设置时区更可靠,然后在那里获取时间戳并将其传递给MySQL查询

比如:

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

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

文档可能不清楚

time\u zone=SYSTEM
表示MySQL服务器时区是从运行MySQL服务器的主机派生的,而不是从客户端系统派生的

因此,如果MySQL服务器主机上的时区与客户端主机上的时区不同,这就解释了您观察到的行为


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

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

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

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

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

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


对于
TIMESTAMP
列,MySQL将这些列存储为UTC。返回到客户端的值取决于客户端时区的设置。作为一个简单的演示:

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)

默认情况下,MySQL的可能副本读取系统时区。如果需要更改,可以通过此处列出的命令行参数进行更改。在表中插入行时,是否使用PHP函数设置值?e、 g.日期();如果是这种情况,请使用phpinfo()检查web服务器时区。我正在通过mysql为我在更新时插入时间戳。不,这不是重复的,我想知道系统时区的含义是什么?如果不是我的机器?我想知道为什么系统返回的时间戳与我机器上的不同?因为MySQL处理时区的方式很奇怪。见我上面的评论——我发现用PHP管理时区的东西要可靠得多。不过,这里有一个链接可能在MySQL方面对您有所帮助。