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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:07:30