php日期验证

Pab*_*pez 47 php validation date

我试图建立一个PHP日期验证(MM/DD/YYYY),但我遇到了问题.这是我得到的样本:

$date_regex = '%\A(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d\z%'; 

$test_date = '03/22/2010'; 
if (preg_match($date_regex, $test_date,$_POST['birthday']) ==true) {
    $errors[] = 'user name most have no spaces';`
Run Code Online (Sandbox Code Playgroud)

Nic*_*ica 75

你可以使用checkdate.例如,像这样:

$test_date = '03/22/2010';
$test_arr  = explode('/', $test_date);
if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
    // valid date ...
}
Run Code Online (Sandbox Code Playgroud)

一种更偏执的方法,不盲目相信输入:

$test_date = '03/22/2010';
$test_arr  = explode('/', $test_date);
if (count($test_arr) == 3) {
    if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
        // valid date ...
    } else {
        // problem with dates ...
    }
} else {
    // problem with input ...
}
Run Code Online (Sandbox Code Playgroud)

  • 让我们进入21世纪.[`DateTime :: createFromFormat()`](http://php.net/datetime.createfromformat)和[`DateTime :: getLastErrors()`](http://php.net/datetime.getlasterrors).晚点再谢我. (29认同)
  • 这是最好的解决方案,因为它还检查无效日期,例如2月29日.基于格式的纯正则表达式方法将允许无效日期. (3认同)
  • +1为正则表达式解决方案.并非所有问题都需要正则表达式解决方案. (2认同)
  • @salathe有最好的方法.尼古拉斯应该真正更新他的答案,因为它提供了一种旧方法. (2认同)
  • @salathe那使用系统日期并不是一个好主意. (2认同)

sal*_*the 51

你可以使用DateTime该类的一些方法,这可能很方便; 即,DateTime::createFromFormat()与...结合DateTime::getLastErrors().

$test_date = '03/22/2010';

$date = DateTime::createFromFormat('m/d/Y', $test_date);
$date_errors = DateTime::getLastErrors();
if ($date_errors['warning_count'] + $date_errors['error_count'] > 0) {
    $errors[] = 'Some useful error message goes here.';
}
Run Code Online (Sandbox Code Playgroud)

这甚至允许我们看到实际导致日期解析警告/错误的原因(查看warningserrors数组$date_errors).

  • 值得一提的是你可以直接用`DateTime :: createFromFormat()`来检查它是否是假的,所以`if(DateTime :: createFromFormat('m/d/Y',$ test_date)=== false)exit('bad date format');` (11认同)
  • 只有非常粗暴的@ s3m3n.例如,在没有检查警告的情况下,"44/33/2211"是**有效的**`m/d/Y`日期(它是`22 Sep 914` btw). (2认同)
  • 这不是**总是**最好的方法。如果您已经以分隔值接收输入,但您不知道它们的格式究竟如何(`M` 与`MM`、`YYYY` 与`YY`),我认为`checkdate` 会更灵活并接受任何类似于有效日期的内容。此外,对于`DateTime`,如果我将`31` 写为**month**,它将被认为是有效的,只需添加`2` 年并将其设置为7 月(因为`31%12 = 7`)。我真的不认为这是许多人的预期行为...... (2认同)

Joe*_*oel 28

虽然checkdate很好,但这似乎是非常简洁的功能验证,你也可以给格式.[ 来源 ]

function validateDate($date, $format = 'Y-m-d H:i:s') {
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}
Run Code Online (Sandbox Code Playgroud)

函数是从这个答案php.net复制而来的


->format()对于日期无效但createFromFormat仍设法创建DateTime对象的情况,需要 额外的.例如:

// Gives "2016-11-10 ..." because Thursday falls on Nov 10
DateTime::createFromFormat('D M j Y', 'Thu Nov 9 2016');

// false, Nov 9 is a Wednesday
validateDate('Thu Nov 9 2016', 'D M j Y');
Run Code Online (Sandbox Code Playgroud)


d.r*_*aev 7

而不是庞大的DateTime对象..只需使用核心date()函数

function isValidDate($date, $format= 'Y-m-d'){
    return $date == date($format, strtotime($date));
}
Run Code Online (Sandbox Code Playgroud)