表单输入内容验证:Validator date_format 的一个问题?

我在使用laravel 表单数据验证Validator的时候写入验证规则:
'date' => 'required|date_format:Y-m'
在2017-10-31号的时候我输入2017-09发现不能通过验证,查看源码发现源码是这样的:

protected function validateDateFormat($attribute, $value, $parameters)
    {
        $this->requireParameterCount(1, $parameters, 'date_format');

        if (! is_string($value) && ! is_numeric($value)) {
            return false;
        }

        $date = DateTime::createFromFormat($parameters[0], $value);

        return $date && $date->format($parameters[0]) == $value;
    }

其中$date = DateTime::createFromFormat($parameters[0], $value),在第一个参数,也就是$parameter[0]为'Y-m'的时候,也就是验证年月,$date的内容就为年月+当前的天数和时间,例如当前日期是2017-11-03 11:33:33 那么DateTime::createFromFormat('Y-m', '2017-02')输出的值就为2017-02-03 11:33:33;
那么这就出现了一个问题,假如当前日期是2017-10-31 11:33:33,那么DateTime::createFromFormat('Y-m', '2017-02')输出就会变成2017-03-03 11:33:33,因为2月只有28天,当天数超过28时,就会往月份上累加,所以就会造成验证不通过的问题;
我不知道这个是laravel的一个bug,还是说date_format不允许用来验证年月,有人遇到类似的问题,或者指出我使用错误的地方么

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5
leo

在Y前面加个感叹号

7年前 评论

@leo 好吧,看php官方文档看到了,谢谢

7年前 评论

@leo 我改成date_format:!Y-d之后又发现新的问题;$date->format($parameters[0]) == $value 当中$date->format($parameters[0])输出的内容多了个!,与$value的值不匹配,还是没有通过验证

7年前 评论

@fadexiii 最终怎么处理的呢

7年前 评论
 return [
      'select_time' => 'nullable|date_format:"Y-m"', // 外面用单引号,格式用双引号包住即可。
 ];
5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!