如何解决更改了laravel应用时区,从数据库获取的时间未更改
假设有一个名为Request的口才模型,其next_check列自动播出为日期(受保护的$ dates = ['next_check'];)。
APP_TIMEZONE是最初的欧洲/赫尔辛基(+02:00)
$ artisan tinker
Psy Shell v0.10.4 (PHP 7.4.11 — cli) by Justin Hileman
>>> $pr = Request::find(1);
>>> $pr->next_check = Carbon\Carbon::Now();
>>> $pr->save();
>>> Request::find(1)->next_check;
=> Illuminate\Support\Carbon @1603973824 {#2900
date: 2020-10-29 14:17:04.0 Europe/Helsinki (+02:00),}
看起来很好,假设我们在赫尔辛基,我们保存了14:17:04。
现在将时区更改为Europe / Berlin(+01:00),我假设将返回13:17:04。
>>> Request::find(1)->next_check;
=> Illuminate\Support\Carbon @1603977424 {#2900
date: 2020-10-29 14:17:04.0 Europe/Berlin (+01:00),}
时区已更改,但仍然有返回的时间,该时间最初保存在欧洲/赫尔辛基时间。
这是一种预期的行为吗?如何更改应用程序时区会导致时间转换?
p.s .:在laravel中配置的数据库时区仍然是默认的'+00:00'
解决方法
如果要本地化时间,以便在用户的时区中向用户显示时间,则需要转换现有的日期时间:
$users_timezone = 'Europe/Berlin';
$datetime->setTimezone($users_timezone);
这实际上将根据应用的时区和转换为时区之间的时差来更改时间。
,为了获得预期的行为,我现在找到了解决方案。如果其他人想要完全相同的行为,这可能是解决方案:
在您的AppServiceProvider的启动方法中添加以下调用:
$this->setUTCOffsetInDBConnection();
setUTCOffsetInDBConnection方法的代码如下:
// according to https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/
private function setUTCOffsetInDBConnection() {
$now = new \DateTime();
$mins = $now->getOffset() / 60;
$sgn = ($mins < 0 ? -1 : 1);
$mins = abs($mins);
$hrs = floor($mins / 60);
$mins -= $hrs * 60;
$offset = sprintf('%+d:%02d',$hrs*$sgn,$mins);
DB::statement("SET time_zone='".$offset."';");
}
这将始终根据您应用的时区同步时区,并将时间戳记为UTC格式保存在数据库中。
当您现在通过.env中的APP_TIMEZONE = Europe / Berlin从应用程序中保存时间戳2020-10-29 15:28:00时,会将其另存为UTC在数据库中(2020-10-29 15: 28:00)。 现在将APP_TIMEZONE更改为Europe / Helsinki时,您将获得2020-10-29 16:28:00返回。
请注意,由于phpMyAdmin在打开连接时也会设置服务器时区,因此phpMyAdmin可能仍未在数据库中显示已保存的UTC时间。因此,如果您运行phpMyAdmin的服务器也在欧洲/柏林,您将看到2020-10-29 15:28:00而不是数据库中保存的UTC日期。
,“是预期行为”的答案是是
要“保存”带有日期数据的时区,还必须将其另存为一列。
因此,在数据库中同时具有“ 2020-10-29 14:17:04.0”和“ Europe / Helsinki”将使您记住用于保存该日期的时区,因此,如果更改了日期,则可以进行转换。 / p>
但是首先您应该考虑不要更改应用程序和数据库时区,两者都应保持UTC。
请参见https://medium.com/@kylekatarnls/always-use-utc-dates-and-times-8a8200ca3164
因此,您可以轻松地将它们转换为任何时区,并根据用户时区正确显示,同时在数据库中保留标准的知名格式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。