PHP中checkdate日期验证方法详解
在PHP中如何检查一个日期是否有效呢,例如,你想要确保用户不会提交一个类似“1962年2月30日”这样的生日。
很简单,我们可以使用checkdate()函数,代码如下:
$valid = checkdate($month,$day,$year);
当$month位于1-12之间,$year位于1-32767之间,$day位于1和$year及$month所代表的相应年、月份中最大的天数之间时,函数checkdate()会返回true。checkdate()函数能够正确地处理闰年,而且日期使用公历(阳历)来表示。
由于checkdate()的有效年份太过宽泛,所以假如你要得到一个有效的出生日期的话,就必须要对年份进行额外的验证。已经证实的人类的最长寿命是122岁。要验证出生日期所表示的年龄处在18-122岁之间,可以使用下例中所示的pc_ checkbirthdate()函数。
<?php
function pc_checkbirthdate($month,$day,$year) {
$min_age = 18;
$max_age = 122;
if (! checkdate($month,$day,$year)) {
return false;
}
list($this_year,$this_month,$this_day) = explode(',',date('Y,m,d'));
$min_year = $this_year - $max_age;
$max_year = $this_year - $min_age;
print "$min_year,$max_year,$month,$day,$year\n";
if (($year > $min_year) && ($year < $max_year)) {
return true;
} elseif (($year == $max_year) &&
(($month < $this_month) ||
(($month == $this_month) && ($day <= $this_day)))) {
return true;
} elseif (($year == $min_year) &&
(($month > $this_month) ||
(($month == $this_month && ($day > $this_day))))) {
return true;
} else {
return false;
}
}
// check December 3, 1974
if (pc_checkbirthdate(12,3,1974)) {
print "You may use this web site.";
} else {
print "You are too young to proceed.";
exit();
}
?>这个函数首先使用checkdate()来确保$month. $day和$year表示的都是有效日期。通过多次比较来保证所提供的日期处在$min_age和$max_age所设置的范围之内。
如果$year未包含在$min_year和$max_year之间,表示日期处在合理的范围之内,所以函数返回true。如果$year没有包含在设定的范围之内,则还需进行额外的验证。如果$year等于$max_year(例如,2002年,$year是1984),$month必须是在当前的月份之前。如果$month等于当前月份,$day就必须在当天或者是之前的某一天。如果$year等于$min_year(例如,在2002年,$year是1880),$month必须是在当前月份之后。如果$month等于当前月份,$day就必须在当天以后。如果不符合以上任何一个条件,则表明所提供的日期位于可以接受的范围之外,函数就会返回false。
如果所提供的日期按当前日期算正好是$min_age年,函数会返回true;但如果提供的日期按当前日期算正好过了$max_age年,函数会返回false。也就是说,如果当前日期正好是用户18岁的生日,则验证通过,但如果是123岁则验证不会通过。