我的本地服务器上有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
现在,我想在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
的测试:
它以UTC(GMT + 0)显示16:34。
现在我尝试更改mysql的配置(在/etc/mysql/mysql.conf.d/mysqld.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
现在,原始显示的内容有所不同(从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中:
它在UTC(GMT + 0)上显示14:34。
我原以为Laravel / Carbon(或者可能是MySQL)会理解该日期仍然相同,但看起来似乎不一样。另外,在Test 1
的配置下,当默认列为CURRENT_TIMESTAMP
时,Laravel将其理解为UTC,这是错误的,因为MySQL会将其初始化为GMT + 2(在我的情况下)。
例如,当我在具有时间戳列INSERT INTO
到DEFAULT
的表(Laravel外部,来自Adminer或PhpMyAdmin)上执行CURRENT_TIMESTAMP
查询时,MySQL将插入“ 18:00”作为GMT + 2,而Laravel将读取“ 18:00”作为GMT + 0。如何避免这个问题?是否像Test 2
中那样设置mysqld参数正确?
您需要在PHP配置中更改时区。
在您的php.ini文件中,更改此值-date.timezone
或者您可以在Laravel配置中设置时区。
在您的app / config / app.php中-'timezone' => 'UTC'
更改此值。