Laravel中使用Jalali日历转换日期时出现Undefined index: year错误,无法存储日期至数据库
解决Jalali日期转换时"Undefined index: year"的错误
这个问题我之前也碰到过,核心原因很明确:你传入的日期字符串是波斯数字(比如۱۴۰۰、۰۳),但Morilog\Jalali\Jalalian::fromFormat()方法默认是基于阿拉伯数字(0-9)来解析日期格式的,它没办法识别波斯数字,解析失败后就会触发Undefined index: year这个错误。
解决方案:先把波斯数字转换成阿拉伯数字
你可以先写一个简单的转换函数,把日期里的波斯数字替换成阿拉伯数字,再传给Jalalian处理:
// 波斯数字转阿拉伯数字的辅助函数 function convertPersianToArabic($string) { $persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']; $arabicDigits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; return str_replace($persianDigits, $arabicDigits, $string); } // 你的原日期 $pdate = "۱۴۰۰/۰۳/۲۹"; // 转换为阿拉伯数字格式的日期 $standardDate = convertPersianToArabic($pdate); // 现在再执行转换就不会报错了 $carbonDate = \Morilog\Jalali\Jalalian::fromFormat('Y/m/d', $standardDate)->toCarbon();
验证结果
你可以用var_dump($carbonDate)来检查转换后的结果,应该能得到一个有效的Carbon实例,里面包含正确的公历日期信息。
额外说明
之所以会出现这个错误,是因为当Jalalian无法正确解析传入的日期字符串时,它内部的解析逻辑会失败,返回的数组里不存在year这个键,代码后续调用时就会触发Undefined index的警告/错误。所以只要确保传入的日期是组件能识别的阿拉伯数字格式,问题就解决了。
内容的提问来源于stack exchange,提问作者user1749030
相关产品推荐
相关产品推荐

