You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用Carbon配合Jalali生成波斯儒略日期报错如何解决

错误原因

Argument 1 passed to Morilog\Jalali\Jalalian::fromCarbon() must be an instance of Carbon\Carbon, string given
该报错核心原因是Jalalian::fromCarbon()方法要求入参必须是Carbon\Carbon类型的对象,但你直接传入的$panelfile->expiration是从数据库读取的字符串格式日期,没有自动转换为Carbon实例。

解决方案
  • 第一步:在Panelfile模型中配置日期字段自动转换
    打开app/Models/Panelfile.php文件,在模型属性中添加$casts配置,将expiration字段指定为日期类型,Laravel会自动将该字段的读写转换为Carbon实例:
// Panelfile 模型代码
protected $casts = [
    'expiration' => 'datetime',
];

旧版本Laravel也可以用$dates属性实现同等效果:

protected $dates = [
    'expiration',
];
  • 第二步:简化控制器中的日期转换逻辑
    原代码存在冗余操作:先用Jalalian格式化出字符串,再丢给CalendarUtils::toJalali()二次转换,直接用Jalalian输出对应格式的波斯日期即可,修正后的控制器代码如下:
Public function edit(Panelfile $panelfile)
{
    $date = Jalalian::fromCarbon($panelfile->expiration)->format('Y-m-d');
    return view('file.edit',compact('panelfile','date'));
}
  • 第三步:修正前端输入框语法错误
    原输入框代码中name"expiration"缺少等于号,会导致表单提交时无法正常传值,修正后代码:
<div class="form-group">
    <input type="text" name="expiration" value="{{$date}}" data-jdp>
</div>
  • 可选方案:如果不希望修改模型配置,也可以在控制器中手动将字符串日期转为Carbon实例:
Public function edit(Panelfile $panelfile)
{
    $expirationCarbon = \Carbon\Carbon::parse($panelfile->expiration);
    $date = Jalalian::fromCarbon($expirationCarbon)->format('Y-m-d');
    return view('file.edit',compact('panelfile','date'));
}

内容的提问来源于stack exchange,提问作者Sina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:54:00