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

Laravel用Morilog\Jalali转Jalali日期入库报Undefined index: year如何解决

Laravel Morilog Jalali 转换日期报Undefined index: year错误解决方案

错误原因

该报错是因为Jalali日期解析逻辑无法从输入的日期字符串中提取到年字段,触发原因有两个:

  1. 调用日期转换方法的方式不符合扩展包要求
  2. 输入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:42:03