Laravel日期格式验证dd/mm/yyyy

3

有一个简单的问题,请帮我解决。我想验证日期格式(dd/mm/yyyy)。 如果我的输入是05/02/1991或5/2/1991,它应该返回'true',但是

 public function rules()
  {
    return [
        'date_of_birth'         => 'required|date_format:"d/m/Y"'
    ];
  }

在上述规则中,它仅返回对于 05/02/1991true。我需要匹配它们两个。
4个回答

3
您可以结合使用日期正则表达式来处理,因为date_format只能处理一种格式:
<?php

public function rules()
{
    return [
        'date_of_birth' => 'required|date|regex:/\d{1,2}\/\d{1,2}\/\d{4}/'
    ];
}

1

date验证器只接受一个日期格式作为参数。如果要使用多个格式,您需要构建自定义验证规则。这很简单。为了能够在单个验证器中使用多个日期格式,您可以在AppServiceProvider中定义多格式日期验证,具体代码如下:

class AppServiceProvider extends ServiceProvider  
{
 public function boot()
 {
    Validator::extend('date_multi_format', function($attribute, $value, $formats) {
        // iterate through all formats
        foreach($formats as $format) {

            // parse date with current format
            $parsed = date_parse_from_format($format, $value);

            // if value matches given format return true=validation succeeded 
            if ($parsed['error_count'] === 0 && $parsed['warning_count'] === 0) {
              return true;
            }
          }

     // value did not match any of the provided formats, so return false=validation failed
     return false;
    });
  }
}

您可以像这样使用这个新的验证规则:
'date' => 'date_multi_format:"Y-m-d H:i:s.u","Y-m-d"' //or any other format

希望这有所帮助。

0

我遇到了一个类似的问题,其中一些表单使用时间选择器,而其他表单则使用<input type="time">。后者无论浏览器中使用的格式如何,都会格式化为24小时制。

继@Foysal的答案之后,现在您还可以创建一个Rule对象来定义您的规则,而不必扩展验证器。

@see https://laravel.com/docs/8.x/validation#using-rule-objects

运行php artisan make:rule DateMultiFormat

然后在位于app/Rules的新Rule对象中,您可以添加相同的逻辑。

在构造函数中接受可接受的格式,然后在passes()方法中添加逻辑。

foreach ($this->acceptedFormats as $format) {
    $parsed = date_parse_from_format($format, $value);
    
    if ($parsed['error_count'] === 0 && $parsed['warning_count'] === 0) {
        return true;
    }
}
        
return false;

而在您的验证器类中...

public function rules()
{
    return [
        'date' => [
            'required', // or whatever
            new DateMultiFormat(['m/d/Y', 'Y-m-d']),
        ],
        ...
    ];

在我的使用情况下,我还必须允许在准备表单输入以持久化到数据库时使用两种格式。
try {
    $start = Carbon::createFromFormat('m/d/Y g:i A', $startString, $locationTimeZone);
} catch (InvalidFormatException $e) {
    $start = Carbon::createFromFormat('m/d/Y H:i', $startString, $locationTimeZone);
}

-1

请将此验证与您的验证进行比较

public function rules()

   return [
      'date_of_birth'         => 'required|date_format:m/d/Y'
    ];
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接