Laravel用Morilog\Jalali转Jalali日期入库报Undefined index: year如何解决
Laravel Morilog Jalali 转换日期报
Undefined index: year错误解决方案 错误原因
该报错是因为Jalali日期解析逻辑无法从输入的日期字符串中提取到年字段,触发原因有两个:
- 调用日期转换方法的方式不符合扩展包要求
- 输入的Jalali日期格式不合法,或者类名大小写错误导致解析逻辑异常
解决方案
方案一:使用官方推荐的Jalalian类转换(更稳定)
Morilog Jalali 扩展包官方更推荐通过Jalalian类完成Jalali日期到公历Carbon对象的转换,修改后的代码如下:
Panelfile::create([ 'title' => $request->title, 'color' => $request->color, 'expiration' => \Morilog\Jalali\Jalalian::fromFormat('Y/m/d', $request->expiration)->toCarbon(), ]);
fromFormat方法的第一个参数对应输入的Jalali日期格式,toCarbon()会直接返回转换完成的公历Carbon对象,写入数据库datetime类型字段时会自动完成格式适配。
方案二:保留CalendarUtils调用的修复方式
如果需要保留原有CalendarUtils的调用逻辑,先补充日期合法性校验,再执行转换即可:
// 校验输入格式合法性 $request->validate([ 'expiration' => 'required|string|regex:/^\d{4}\/\d{2}\/\d{2}$/' ]); // 校验Jalali日期本身合法 list($jy, $jm, $jd) = explode('/', $request->expiration); if (!\Morilog\Jalali\CalendarUtils::checkDate($jy, $jm, $jd)) { // 此处添加非法日期的业务处理逻辑 } Panelfile::create([ 'title' => $request->title, 'color' => $request->color, 'expiration' => \Morilog\Jalali\CalendarUtils::createCarbonFromFormat('Y/m/d', $request->expiration), ]);
注意事项
- 类名需要注意大小写:Linux环境下Laravel对命名空间大小写敏感,原有代码中小写的
\morilog\会出现类加载异常,统一修改为首字母大写的\Morilog\即可。 - 若日期选择器输出的日期存在前导零缺失的情况(比如
1400/8/1),需要将格式参数调整为Y/n/j适配,否则也会触发解析错误。
内容的提问来源于stack exchange,提问作者Sina
相关产品推荐
相关产品推荐

