Laravel中提交d/m/y格式日期提示无效格式问题如何解决
Laravel出生日期验证格式错误排查方案
核心问题原因
- 日期格式符匹配错误
PHP日期格式规范中,小写y仅匹配2位数字年份(如1995年对应95),你需要验证的是4位年份(如1995),应该使用大写格式符Y。你当前写的date_format:d/m/y只能匹配23/12/95这类输入,提交23/12/1995自然会触发格式错误。 - 验证规则冲突
你同时使用了date和date_format两个规则,Laravel的date规则会优先调用strtotime解析日期,d/m/Y格式在strtotime逻辑中会被误识别为m/d/Y,只要日期中的日大于12就会直接解析失败,不会走到后续的date_format验证环节,这两个规则同时使用属于冗余配置。
修复后的验证代码
你可以直接替换原有规则,同步修改闭包内Carbon解析的格式符即可:
'date_of_birth' => [ 'required', 'bail', 'date_format:d/m/Y', function ($attribute, $value, $fail) { $age = Carbon::createFromFormat('d/m/Y', $value)->diff(Carbon::now())->y; if($age < 18 || $age > 70) { $fail('Âge invalide. l\'âge devrait être 18-70'); } }, ]
可选优化方案
你也可以直接使用Laravel内置的日期范围规则,不需要自定义闭包实现年龄限制:
'date_of_birth' => [ 'required', 'bail', 'date_format:d/m/Y', 'before:' . now()->subYears(18)->format('d/m/Y'), 'after:' . now()->subYears(70)->format('d/m/Y'), ]
如果修改后依然报错,你可以打印请求中的date_of_birth参数值,确认前端提交的内容没有额外空格、特殊字符,分隔符确实为/即可。
内容的提问来源于stack exchange,提问作者Volka Dimitrev
相关产品推荐
相关产品推荐

