提问者:小点点

Laravel和MySQL时间戳值随mysqld配置而改变


我的本地服务器上有MySQL和Laravel,默认配置,我的时区是GMT+2。

我没有接触到MySQL配置中的任何东西,我在数据库上尝试了一些东西:

SELECT CURRENT_TIMESTAMP, UTC_TIMESTAMP;

结果:

CURRENT_TIMESTAMP       UTC_TIMESTAMP
2020-06-09 16:34:58     2020-06-09 14:34:58

现在,我想要这个raw in LARAVEL:

id  device_id   lat        lng          alt     at      created_at               updated_at
1   10          10.000000  10.000000    NULL    NULL    2020-06-09 16:21:55      2020-06-09 16:21:55

下面是我使用PHP artisan Tinker进行的测试:

它显示世界协调时16:34(格林尼治标准时间+0)。

现在我尝试更改mysql的配置(在/etc/mysql/mysql.conf.d/mysql.cnf中),我设置了这个配置:

default_time_zone='+00:00'

我重新启动服务器:

sudo service mysql restart

然后我再试一次上面同样的测试:

CURRENT_TIMESTAMP       UTC_TIMESTAMP
2020-06-09 14:42:46     2020-06-09 14:42:46

现在,raw显示了一些不同的东西(从16到14小时):

id  device_id   lat        lng          alt     at      created_at               updated_at
1   10          10.000000  10.000000    NULL    NULL    2020-06-09 14:21:55      2020-06-09 14:21:55

在Laravel:

它显示的是世界协调时14:34(格林尼治标准时间+0)。

我希望Laravel/Carbon(或者可能是MySQL)理解日期仍然是相同的,但它看起来不是。
另外,在配置test1时,当列默认为current_timestamp时,Laravel将其理解为UTC,这是错误的,因为MySQL将其初始化为GMT+2(在我的例子中)。

例如,当我对一个表执行insert into查询(在Laravel之外,从Adminer或PhpMyAdmin),该表的时间戳列defaultcurrent_timestamp时,MySQL将插入“18:00”作为GMT+2,而Laravel将读取“18:00”作为GMT+0.
如何避免这个问题? 像test2中那样设置mysqld参数是否正确?


共1个答案

匿名用户

您需要在PHP配置中更改时区。

在php.ini文件中,更改此值-date.timezone

也可以在Laravel配置中设置时区。

在-app/config/app.php中-'timezone'=>; 'UTC'更改此值。