Php 碳不';在Laravel上使用'diffForHumans()'时,不会自动转换时区
我是拉威尔的新手,在碳元素上乱搞(这是我第一次使用它,甚至是第一次听说它) 我制作了一个简单的博客,其中显示了在(一个Php 碳不';在Laravel上使用'diffForHumans()'时,不会自动转换时区,php,laravel,php-carbon,Php,Laravel,Php Carbon,我是拉威尔的新手,在碳元素上乱搞(这是我第一次使用它,甚至是第一次听说它) 我制作了一个简单的博客,其中显示了在(一个时间戳栏)创建的注释,以及碳元素的diffForHuman()。我设法显示了它,但它显示的不是“x分钟前”,而是“从现在开始的z小时”(正好是我的时区和UTC之间的差异,即UTC+z),好像这些评论来自未来 这是我的密码: {{ $comment->created_at->diffForHumans() }} 由于我从未在我的config/app.php中更改时区,
时间戳
栏)创建的注释,以及碳元素的diffForHuman()
。我设法显示了它,但它显示的不是“x分钟前”,而是“从现在开始的z小时”(正好是我的时区和UTC之间的差异,即UTC+z),好像这些评论来自未来
这是我的密码:
{{ $comment->created_at->diffForHumans() }}
由于我从未在我的config/app.php
中更改时区,因此我假设Carbon不会在diffForHumans()
上自动将timestamp
转换为当前时区
我是否必须明确设置时区,以使碳显示具有正确的差异?还是我做错了什么
编辑:
我完全了解apokryfos关于时间转换的说法(将其保存在UTC中,并将其转换为客户端时区以供显示)
我注意到了一些事情。首先,我用php artisan serve运行我的应用程序,用XAMPP运行我的DB(10.1.33-MariaDB)。因此,我的应用程序的时区是UTC(默认配置),我的DB与我的机器相同(UTC+z)。所以我在想,也许当我的应用程序检索到在``timestamp
创建的时,我的数据库返回了在我机器时区(UTC+z)创建的,这很奇怪如果是这种情况,为什么拉威尔在检索时不自动将时间戳
转换为应用程序的时区?是否可能将返回的时间戳
的时区视为与应用程序具有相同的时区?您可以使用访问器在模型中返回前的日期应用时区详情如下:
public function getCreatedAtAttribute($date)
{
return Carbon::parse($date)->timezone('your time zone goes here'); //example Europe/Amsterdam
}
这是因为我的应用程序和数据库的时区不同。我的DB使用XAMPP运行,时区与我的机器相同(UTC+z),我的应用程序使用php artisan serve运行,时区为默认配置(UTC)
将我的应用程序配置到与我的机器相同的时区后,Carbon的diffForHumans()
显示了正确的差异。在config/app.php
中设置了什么时区UTC
或UTC+z
?传统的做法是将服务器端设置为UTC,并在客户端转换时区,因为浏览器可以访问用户的首选时区,而服务器不能访问。@fubar UTC。我必须把它改成我的时区,这样差别就大了right@apokryfos我知道这一点,但我认为由于差异是在服务器端处理的,因此不需要进行转换。根据您注意到的,您的数据库与应用程序设置的时区不同。这可能会导致MySQL将时间戳转换为它的时区,然后laravel假设它在应用程序时区接收到它,从而导致问题。请注意,时间戳实际上并不保留时区。