格式化 Carbon 日期实例

88

我有一个数组,其返回以下日期时间:

$item['created_at'] => "2015-10-28 19:18:44"

如何在使用Carbon的Laravel中将日期更改为M d Y格式?

目前它返回一个错误

$suborder['payment_date'] = $item['created_at']->format('M d Y');

似乎 created_at 不包含 Carbon 对象的实例。 - Jeemusu
@Jeemusu 嗯,那我怎么把它转换成一个呢? - d3bug3r
4
你是将模型转换为数组吗?因为默认情况下,它是Carbon实例。 - Thomas Kim
还没有被问到,是否有一个非常特殊的超出比例的需求来将 created_at 重命名为 payment_date?只需直接在您的 Blade 模板中使用 $payment->created_at 即可。 - Roland
“created_at” 是 Laravel 内部的列,在迁移文件中使用 $table->timestamps() 时会自动创建。另外,不应该手动设置它。 - Roland
@Jeemusu,当 $table->timestamps(); 在已经存在数据的情况下使用时,可能会出现这种情况。然后可以使用“helper”函数来处理 null 值,例如 function formatCarbon (Carbon $carbon = null) : string { ... } - Roland
13个回答

92

首先将created_at字段解析为Carbon对象。

$createdAt = Carbon::parse($item['created_at']);

那么您可以使用

$suborder['payment_date'] = $createdAt->format('M d Y');

58

Laravel 6.x和7.x的日期转换

/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
   'created_at' => 'datetime:Y-m-d',
   'updated_at' => 'datetime:Y-m-d',
   'deleted_at' => 'datetime:Y-m-d h:i:s'
];
在 Laravel 5 中,您可以在模型中添加属性 protected $dates = ['created_at', 'cached_at'] 来很方便地进行日期操作。详情请参见https://laravel.com/docs/5.2/eloquent-mutators#date-mutators
namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
   /**
   * The attributes that should be mutated to dates.
   *
   * @var array
   */
   protected $dates = ['created_at', 'updated_at', 'deleted_at'];
}

您可以像这样格式化日期:$user->created_at->format('M d Y'); 或者使用 PHP 支持的任何格式。


1
我尝试了这种方法,但当字段为空时,它会转换成奇怪的日期:'date_confirmation' => string '-0001-11-30 00:00:00' (length=20)。您知道为什么会这样做以及如何解决它吗? - Marc Pont
这是一种按使用量计算的方法。我正在寻找一种更通用的方法,即配置项,并且所有 Carbon\Carbon 属性都以相同的方式进行格式化(我已经使用了 protected $dates = ['my_date_at'];). - Roland

27
$suborder['payment_date'] = Carbon::parse($item['created_at'])->format('M d Y');

Payment->created_at 被重命名为 payment_date,不再直接使用 Payment 类(Eloquent 模型),只允许使用 array $item 作为类型提示。这可能不是您想要的? - Roland
我可以问一下为什么我的回答会被踩吗?我刚刚得到了-2,感觉有点不公平,因为我的批评者在二次思考后是正确的。 - Roland

14
如果你正在使用Eloquent模型(根据你的代码,我认为你在使用),就不需要将其转换为数组。只需将其作为对象使用。因为像Thomas Kim说的那样,默认情况下它是Carbon实例。
所以应该是:
$suborder['payment_date'] = $item->created_at->format('Y-m-d')

但如果不是,您需要将其转换为Carbon对象,就像Milan Maharjan的答案一样。

$createdAt = Carbon::parse($item['created_at']);

使用Payment $payment的好处在于,无需将其转换为数组,您可以始终在Blade模板中直接使用Eloquent模型对象。但是我仍然希望不要将created_at重命名为payment_date - Roland

7

在模型中声明:

class ModelName extends Model
{      

 protected $casts = [
    'created_at' => 'datetime:d/m/Y', // Change your format
    'updated_at' => 'datetime:d/m/Y',
];

1
这已经是一个更好的解决方案,因为它是一种按模型方法处理的方式,但还有点不完整。对于 Laravel 的内部列 created_atupdated_at,在您的 Model 中不需要 protected $dates = [];。但如果您有像我一样的自定义列,则必须将其添加到该数组中,并且不要将 protected $timestamps = true; 添加到您的模型中,因为这是默认设置。 - Roland

6
Laravel 5 的时间戳是 Carbon 类的实例,因此您可以直接在时间戳上调用 Carbon 的字符串格式化方法。在您的视图文件中,可以像这样编写代码:
{{$task->created_at->toFormattedDateString()}}

http://carbon.nesbot.com/docs/#api-formatting


2
这仅适用于在添加created_at之后创建的记录,例如通过将$table->timestamps()添加到迁移文件中。对于它之前的记录,created_at将为NULL,然后这将触发有关非对象调用的方法调用的错误。 - Roland

5

这是我的做法。它还显示了AM/PM。

$user->updated_at->format('M, d Y H:i:s A')

5

尝试以下操作:

$createdAt = Carbon::parse(date_format($item['created_at'],'d/m/Y H:i:s');
$createdAt= $createdAt->format('M d Y');

不需要这样做,如果没有设置 protected $timestamps = false;,则 created_at 会自动转换为 Carbon\Carbon。您还需要在迁移文件中添加 $table->timestamps(); - Roland

4

只需使用

Carbon::createFromFormat('Y-m-d H:i:s', $item['created_at'])->format('M d Y');

3

如果你正在使用Eloquent,只需要使用以下内容:

$order->created_at->format('D, M d, Y h:i A')

注意:请编辑您自己的格式。


最简单的解决方案 - mercury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接