Laravel Excel日期验证规则使用及非日期输入报错处理
解决Laravel Excel导入时非日期格式触发的floor()错误
问题根源
错误floor(): Argument #1 ($num) must be of type int|float, string given是因为Date::excelToDateTimeObject()仅能处理Excel原生的日期数值(如45231这类代表日期的数字),当传入字符串等非数值内容时,内部调用的floor函数无法处理,直接抛出类型错误。
有效解决方案
1. 完善验证规则,提前拦截无效数据
先在rules()方法中添加日期列的验证规则,确保导入内容符合日期格式要求:
public function rules(): array { return [ 'nama_perusahaan' => 'required', 'nomor_izin' => 'required', 'tanggal_masuk' => 'required|date', 'tanggal_izin' => 'required|date', ]; }
如果Excel中日期是固定文本格式(比如2024-05-20),可以替换为date_format:Y-m-d做严格格式校验。
2. 安全转换日期,避免直接调用Excel日期方法
改用Carbon的解析能力处理日期,它能自动兼容Excel数值格式和常规字符串日期:
// 替换原代码中日期转换的两行 'tanggal_masuk' => \Carbon\Carbon::parse($row['tanggal_masuk'])->toDateTimeString(), 'tanggal_izin' => \Carbon\Carbon::parse($row['tanggal_izin'])->toDateTimeString(),
3. 优化行级错误提示,精准定位问题
修改验证逻辑,针对当前行做字段校验,并结合行号给出明确提示:
foreach ($rows as $key => $row) { $izin = Izin::where('nama_izin', $row['id_izins'])->where('id_users', Auth::id())->pluck('id')->first(); // 合并所有验证规则与自定义提示 $validator = \Illuminate\Support\Facades\Validator::make($row, [ 'nama_perusahaan' => 'required', 'nomor_izin' => 'required', 'tanggal_masuk' => 'required|date', 'tanggal_izin' => 'required|date', 'id_izins' => function ($attribute, $value, $fail) use ($izin, $key) { if (!$izin) { $fail('Perhatikan "' . $value . '" Pada baris ' . ($key + 2) . ' tidak terdaftar'); } } ]); $validator->validate(); LaporIzin::create([ 'nama_perusahaan' => $row['nama_perusahaan'], 'alamat_perusahaan' => $row['alamat_perusahaan'], 'tanggal_masuk' => \Carbon\Carbon::parse($row['tanggal_masuk'])->toDateTimeString(), 'tanggal_izin' => \Carbon\Carbon::parse($row['tanggal_izin'])->toDateTimeString(), 'nomor_izin' => $row['nomor_izin'], 'id_izins' => $izin, 'id_users' => Auth::id(), ]); }
这样修改后,既能提前拦截无效日期,又能避免转换时的类型错误,同时给出精准的行级错误提示。
内容的提问来源于stack exchange,提问作者Mohammad Kahfi
相关产品推荐
相关产品推荐

