我是Laravel的新手,正在和Carbon混在一起(这是我第一次使用甚至听说过它)。
我创建了一个简单的博客,其中显示了评论的delegate
(UICollectionView
列)和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
的时区视为与应用程序具有相同的时区?
答案 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
显示正确的时差。