使用Laravel和Carbon更改日期输出格式


Change date output format, using Laravel and Carbon

MySQL数据库以Y-m-d H:i:s存储时间,即2000-12-32 00:00:00格式,UTC。

我想知道是否有某种方法可以转换从数据库返回的$order对象的created_at-dateTime属性,因此它会向客户端发送一个dateTime字符串,如下所示:31/04/16 14:25pm,不带秒。

for($i = 0;  $i < sizeof($orders); $i++ ) { 
    $orders[$i]->created_at = $orders[$i]->created_at->format('d/m/y H:i');
}

欢迎使用访问器和突变体:

使用Laravel的正确方法是定义访问器:当Eloquent试图检索字段的值时,它将自动调用访问器。这意味着您不必在一组对象上循环,然后转换值,只需在模型中定义Accessor即可。

解决方案1:

因此,对于您的日期字段,请在Orders Model 中添加以下方法

public function getCreatedAtAttribute($value)
{
    return $value->format('d/m/y H:i a');
}

访问器的名称应该是getFieldAttribute,您可以将字段替换为相应的列名。这样你就不必在结果上循环了。

注:请记住,通过这样做,您现在将created_at作为一个字符串,而不是模型中的Carbon对象,那么这会对您产生什么影响呢?如果您在其他地方进行比较,您也可以使用MutatorAccessor上设置更多字段值,并且可以在此处找到Mutatorhttps://laravel.com/docs/5.1/eloquent-mutators

解决方案2:

是的,基本上在所有数组上循环并进行转换。

for($i = 0;  $i < count($orders); $i++ ) {
    $orders[$i]->created_at = $orders[$i]->created_at->format('d/m/y H:i a');
}

更新:

如果遇到诸如"找不到分隔符号"或"找到意外数据"之类的错误调整解决方案如下:

解决方案#1:

public function getCreatedAtAttribute($value)
{
    return Carbon'Carbon::createFromFormat('Y-m-d H:i:s', $value->toDateTimeString())->format('d/m/y H:i a');
}

解决方案2:

for($i = 0;  $i < count($orders); $i++ ) {
    $orders[$i]->created_at = Carbon'Carbon::createFromFormat('Y-m-d H:i:s', $orders[$i]->created_at->toDateTimeString())->format('d/m/y H:i a');
}

你是对的,你可以格式化created_at time

foreach($orders as $order){
echo $order->created_at->format('d/m/y H:i a');
}

假设$orders是一个有说服力的模型,created_atupdated_at属性将自动转换为carbon实例,因此您已经可以在它们上运行carbon方法。

请参阅有关此主题的文档:https://laravel.com/docs/5.2/eloquent-mutators#date-突变

所以,你的代码:

$orders[$i]->created_at->format('d/m/y H:i');

应该工作得很好!

您可以在Order模型中添加一个helper方法,使其可读性更强,类似于以下内容:

public function createdAtTimeStamp()
{
    return $this->created_at->format('d/m/y H:i');
}

然后你可以这样访问它:

$orders[$i]->createdAtTimeStamp()