格式化 Carbon 日期实例
Posted
技术标签:
【中文标题】格式化 Carbon 日期实例【英文标题】:Formatting a Carbon date instance 【发布时间】:2016-01-29 02:31:37 【问题描述】:我有一个返回以下日期时间的数组:
$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
不包含碳对象的实例。
@Jeemusu 是的,那我怎样才能把它转换成一个呢?
您是在将模型转换为数组吗?因为默认情况下,它是一个 Carbon 实例。
还没有被问到,将created_at
重命名为payment_date
是否有非常特殊的超大规模需要?直接在刀片模板中使用$payment->created_at
。
并且:created_at
是 Laravel 内部的列,当您在迁移文件中使用 $table->timestamps()
时会自动拥有它。另外,您不应该自行设置。
【参考方案1】:
如果你使用的是 eloquent,就用这个:
$order->created_at->format('D, M d, Y h:i A')
注意:编辑您自己的格式。
【讨论】:
【参考方案2】:我就是这样做的。它还显示上午/下午。
$user->updated_at->format('M, d Y H:i:s A')
【讨论】:
【参考方案3】:为您的模型添加 casts 属性
protected $casts = [
'created_at' => 'date',
'payment_date' => 'date'
];
如果您还想格式化日期时间,只需添加日期时间而不是日期
protected $casts = [
'created_at' => 'datetime',
'payment_date' => 'datetime'
]
【讨论】:
【参考方案4】: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
日期修改器:Laravel 5.x
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 支持的任何格式来格式化日期。
【讨论】:
我尝试了这种方法,但是当该字段为空时,它会转换为一个奇怪的日期:'date_confirmation' => string '-0001-11-30 00:00:00' (length=20)
。你知道为什么要这样做以及我该如何解决它吗?
这是一种按使用情况的方法。我寻找一种更通用的方法,意味着配置条目和所有Carbon\Carbon
属性的格式相同(我已经使用protected $dates = ['my_date_at'];
)。【参考方案5】:
只需使用date()
和strtotime()
函数即可节省您的时间
$suborder['payment_date'] = date('d-m-Y', strtotime($item['created_at']));
别紧张!!!
【讨论】:
【参考方案6】:随便用
Carbon::createFromFormat('Y-m-d H:i:s', $item['created_at'])->format('M d Y');
【讨论】:
【参考方案7】:在模型中声明:
class ModelName extends Model
protected $casts = [
'created_at' => 'datetime:d/m/Y', // Change your format
'updated_at' => 'datetime:d/m/Y',
];
【讨论】:
这已经是一个更好的解决方案,因为它是一种基于模型的方法,但有点不完整。对于 Laravel 的内部列created_at
和 updated_at
,您的 Model
中不需要 protected $dates = [];
。但是,如果您有像我这样的自定义列,您可以将它们添加到该数组中,并且不要将 protected $timestamps = true;
添加到您的模型中,因为这是默认值。【参考方案8】:
Laravel 5 时间戳是 Carbon 类的实例,因此您可以直接在时间戳上调用 Carbon 的字符串格式化方法。在你的视图文件中有这样的东西。
$task->created_at->toFormattedDateString()
http://carbon.nesbot.com/docs/#api-formatting
【讨论】:
这仅适用于创建之后created_at
已添加的记录,例如通过将$table->timestamps()
添加到您的迁移文件中,对于它之前的记录,created_at
将是NULL
,然后这将触发有关非对象调用的方法调用的错误。【参考方案9】:
$suborder['payment_date'] = Carbon::parse($item['created_at'])->format('M d Y');
【讨论】:
Payment->created_at
然后重命名为 payment_date
并且不使用直接的 Payment
类(Eloquent 模型),它只允许 array $item
作为类型提示。也许不是你想要的?
我可以问一下为什么我对这个答案投了反对票吗?我刚得到-2,感觉有点不公平,因为我的批评者认为第二好。【参考方案10】:
试试看:
$createdAt = Carbon::parse(date_format($item['created_at'],'d/m/Y H:i:s');
$createdAt= $createdAt->format('M d Y');
【讨论】:
不需要这个,created_at
会自动转换为 Carbon\Carbon
,如果 protected $timestamps = false;
设置为 NOT。您的迁移文件中还需要一个$table->timestamps();
。【参考方案11】:
如果您使用的是 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
用法很好,因此无需将其转换为数组,您始终可以在刀片模板中直接使用 Eloquent 模型对象。但我仍然不想将created_at
重命名为payment_date
。【参考方案12】:
首先将 created_at 字段解析为 Carbon 对象。
$createdAt = Carbon::parse($item['created_at']);
然后就可以使用了
$suborder['payment_date'] = $createdAt->format('M d Y');
【讨论】:
以上是关于格式化 Carbon 日期实例的主要内容,如果未能解决你的问题,请参考以下文章
text 在Laravel中使用Carbon格式化PHP中的日期字符串