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
相关产品推荐
相关产品推荐

