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

Mar*_*arc 5 php mysql laravel php-carbon

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

测试1

我没有触及 MySQL 配置中的任何内容,而是在数据库上尝试了一些操作:

SELECT CURRENT_TIMESTAMP, UTC_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

结果:

CURRENT_TIMESTAMP       UTC_TIMESTAMP
2020-06-09 16:34:58     2020-06-09 14:34:58
Run Code Online (Sandbox Code Playgroud)

现在,我想在 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
Run Code Online (Sandbox Code Playgroud)

这是我使用的测试php artisan tinker

测试1

显示 UTC (GMT+0) 时间 16:34。

测试2

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

default_time_zone='+00:00'
Run Code Online (Sandbox Code Playgroud)

我重新启动我的服务器:

sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)

然后我再次尝试与上面相同的测试:

CURRENT_TIMESTAMP       UTC_TIMESTAMP
2020-06-09 14:42:46     2020-06-09 14:42:46
Run Code Online (Sandbox Code Playgroud)

现在,原始数据显示出不同的情况(从 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
Run Code Online (Sandbox Code Playgroud)

在 Laravel 中:

在此输入图像描述

显示 UTC (GMT+0) 时间 14:34。

问题

我本以为 Laravel/Carbon(或者 MySQL)能够理解日期仍然相同,但看起来却并非如此。
另外,通过 的配置Test 1,当 Laravel 默认的列CURRENT_TIMESTAMP将其理解为 UTC 时,这是错误的,因为 MySQL 会将其初始化为 GMT+2 (在我的例子中)。

例如,当我对INSERT INTO具有时间戳列的表(Laravel 外部,来自 Adminer 或 PhpMyAdmin)执行查询DEFAULTCURRENT_TIMESTAMP,MySQL 会将“18:00”插入为 GMT+2,而 Laravel 会将“18:00”读取为格林威治标准时间+0。
我怎样才能避免这个问题?设置 mysqld 参数是否Test 2正确?

小智 -2

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

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

或者您可以在 Laravel 配置中设置时区。

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