PHP checkdate()似乎允许小数

时间:2014-04-16 16:48:56

标签: php

所以今天我发现checkdate()

有点异常

基本上,它允许小数

checkdate(2,21.5,2000); //returns TRUE checkdate(2.345,28.345,1988.3453); //returns TRUE

是正常的吗?因为我希望checkdate()也会检查输入的值是整数而不是小数...更令人讨厌的是is_int()不能用于字符串

2 个答案:

答案 0 :(得分:3)

为什么它不起作用?

checkdate()函数不检查传递给它的参数是否是有效整数。如果它们不是,它只是将其转换为整数,就像应用了intval()一样。因此,这就是checkdate()处理它们时日期值的样子:

$a = array(2,21.5,2000);
$b = array(2.345,28.345,1988.3453);

print_r(array_map('intval', $a));
print_r(array_map('intval', $b));

输出:

Array
(
    [0] => 2
    [1] => 21
    [2] => 2000
)

Array
(
    [0] => 2
    [1] => 28
    [2] => 1988
)

如您所见,小数位后的所有内容都已被删除。

替代解决方案

作为checkdate()的替代方法,您可以使用DateTime类进行验证。它非常强大,可以处理各种日期(Glavićphp.net起作用):

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

答案 1 :(得分:0)

如果您正在处理字符串输入,则可以使用正则表达式检查格式问题,并使用checkdate进行验证。

function is_valid_date($date) {
   // does it look like a date?
    if (preg_match("/^(\d{2})-(\d{2})-(\d{4})$/", $date, $matches)) {
        // is it a valid date?
        return checkdate($matches[1], $matches[2], $matches[3]);
    }
    return false;
}
var_dump(is_valid_date("01-01-1970")); // true
var_dump(is_valid_date("20-20-1970")); // false
var_dump(is_valid_date("1.6-4.3-12345")); // false