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

时间:2018-07-27 05:03:39

标签: php laravel php-carbon

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

我创建了一个简单的博客,其中显示了评论的delegateUICollectionView列)和Carbon的created_at。我设法显示它,但不是显示“ x分钟前”,而是显示“从现在开始的z小时”(恰好是我的时区与UTC之间的时差,即UTC + z),好像评论来自将来。

这是我的代码:

timestamp

由于我从不更改diffForHuman()中的时区,因此我认为Carbon不会自动将{{ $comment->created_at->diffForHumans() }} 转换为config/app.php上的当前时区。

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

编辑: 我完全了解 apokryfos 关于时间转换的内容(将其保存在UTC中并将其转换为客户的时区以显示)。

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

2 个答案:

答案 0 :(得分:2)

您可以使用访问器,如下所示将时区应用于返回模型之前的日期:

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

答案 1 :(得分:0)

发生这种情况是因为我的应用程序和数据库具有不同的时区。我的数据库使用XAMPP运行,并且时区与我的计算机(UTC + z)相同,而我的应用使用public class DoaPagi extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_doa_pagi); } @Override protected void onStart() { super.onStart(); AdapterDoa adapter = new AdapterDoa(getData(this)); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(DoaPagi.this); RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); mRecyclerView.setLayoutManager(linearLayoutManager); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.setAdapter(adapter); } public static List<ModelDoa> getData(Context context) { String[] data = context.getResources().getStringArray(R.array.doasore); List<ModelDoa> list = new ArrayList<>(); list.add(new ModelDoa("London", ModelDoa.DOA_PAGI)); list.add(new ModelDoa("Amsterdam", ModelDoa.DOA_PAGI)); list.add(new ModelDoa("Berlin", ModelDoa.DOA_PAGI)); // error code is here for (int i = 0; i < data.length; i++) { list.add(new ModelDoa(data[i], ModelDoa.DOA_PAGI)); } return list; } } 运行,因此它具有默认配置(UTC)的时区。

将我的应用程序配置为与计算机相同的时区后,Carbon的php artisan serve显示正确的时差。