微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更改了laravel应用时区,从数据库获取的时间未更改

如何解决更改了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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?