在 Laravel 上使用 `diffForHumans()` 时,Carbon 不会自动转换时区

Carbon doesn't automatically convert timezone when using `diffForHumans()` on Laravel

我是 Laravel 的新手,正在研究 Carbon(这是我第一次使用甚至听说过它)。

我创建了一个简单的博客,其中显示评论的 created_attimestamp 列)和 Carbon 的 diffForHuman()。我设法显示了它,但它显示的不是 "x minutes ago" "z hours from now"(正是我的时区和 UTC 之间的差异,即 UTC+z),就好像这些评论来自未来。

这是我的代码:

{{ $comment->created_at->diffForHumans() }}

由于我从不更改 config/app.php 中的时区,我假设 Carbon 不会自动将 timestamp 转换为 diffForHumans() 上的当前时区。

我是否必须明确设置时区才能使 Carbon 显示正确的差异?还是我做错了什么?

编辑: 我完全了解apokryfos所说的时间转换(保存为UTC并转换为客户端时区以供显示)。

我注意到了一些事情。首先,我 运行 我的应用 php artisan serve 和我的数据库 (10.1.33-MariaDB) XAMPP。因此,我的应用程序的时区是 UTC(默认配置),我的数据库与我的机器相同(UTC+z)。所以我在想,也许当我的应用程序检索到 created_at``timestamp 时,我的数据库在我机器的时区 (UTC+z) 中返回了 created_at,这很奇怪。 如果是这种情况,为什么 Laravel 在检索时不会自动将 timestamp 转换为应用程序的时区? 返回的 timestamp 是否有可能? s 时区被视为与应用程序具有相同的时区?

您可以使用访问器在模型中应用 return 之前日期的时区,如下所示:

    public function getCreatedAtAttribute($date)
{
    return Carbon::parse($date)->timezone('your time zone goes here'); //example  Europe/Amsterdam
}

发生这种情况是因为我的应用程序和我的数据库有不同的时区。我的数据库 运行 XAMPP 与我的机器 (UTC+z) 和我的应用程序 运行 与 php artisan serve 具有相同的时区,因此具有默认配置的时区( UTC).

将我的应用程序配置到与我的机器相同的时区后,Carbon 的 diffForHumans() 显示正确的差异。