Mar*_*arc 5 php mysql laravel php-carbon
我的本地服务器上有 MySQL 和 Laravel,采用默认配置,时区是 GMT+2。
我没有触及 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:
显示 UTC (GMT+0) 时间 16:34。
现在我尝试更改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)执行查询DEFAULT时CURRENT_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'更改此值。
| 归档时间: |
|
| 查看次数: |
742 次 |
| 最近记录: |