我当前的时区是 Asia/Karachi 当我从 mysql 检索表数据时它给我(实际时间 - 5 小时)
例如:
mysql 列值:'2021-04-21 01:34:57'
当我从 laravel DB::table('table_name')->get()->toArray(); 检索时;
它给出以下内容:2021-04-20 20:34:57
并且更改我的时区也不会改变任何东西。
所以还有什么我想念的吗?
顺便说一句,我创建了以下路线来检查我当前的时区
$app->get('/timezone', function () { return date_default_timezone_get(); });
它给出了保存在我的环境中的相同内容,即(亚洲/卡拉奇)但这不会改变我从 mysql 获得的结果,即使我将它更改为亚洲/加尔各答等其他时区。
我试着研究这个但没有得到任何合适的答案。
我尝试了很多东西来解决这个问题,比如 添加环境变量
APP_TIMEZONE="Asia/Karachi"
(没有用)
我也尝试添加DB_TIMEZONE="+05:00"
(这在我当地有效但不适用于分期)
最后我在某个地方看到其他人有完全相同的问题来解决这个问题,他通过使用碳增加时间来做到这一点
'posted_at' => Carbon::parse($record->posted_at)->addHours(5)->toDateTimeString(),
我知道这不是最佳解决方案,但这是唯一有效的解决方案,所以我不得不接受它。
https://dev.mysql.com/doc/refman/8.0/en/datetime.html
如果您存储一个 TIMESTAMP 值,然后更改时区并检索该值,则检索到的值与您存储的值不同。发生这种情况是因为没有在两个方向上使用相同的时区进行转换。当前时区可用作 time_zone 系统变量的值。
据我所知,你有几件事要考虑:
你的 Laravel/Lumen 应用的时区
这可以在
config/app.php
-> timezone
中找到。
MySQL 服务器的时区
您可以使用以下方式检索:
mysql> SELECT @@global.time_zone, @@session.time_zone;
服务器本身的时区
如果上面的 mySQL 查询返回
SYSTEM
,这意味着它使用系统时区设置,对于 Debian/Ubuntu 等你可以检查使用:
cat /etc/timezone
根据我的经验,你通常可以保持系统/mySQL 时区不变,只在 Laravel 配置中设置正确的时区。我知道这让我头疼,因为我第一次不得不弄清楚它是如何工作的。
我设置了 DB_TIMEZONE="Europe/Tallinn" 一切正常