Просто интересно, могу ли я сделать это, чтобы подтвердить, что пользователь ввел дату более 18?
//Validate for users over 18 only function time($then, $min) { $then = strtotime('March 23, 1988'); //The age to be over, over +18 $min = strtotime('+18 years', $then); echo $min; if(time() < $min) { die('Not 18'); } }
Просто наткнулся на эту функцию date_diff: http://www.php.net/manual/en/function.date-diff.php Выглядит, еще более перспективным.
Почему нет? Единственная проблема для меня – это интерфейс пользователя – как вы отправляете сообщение об ошибке элегантно пользователю.
С другой стороны, ваша функция может работать некорректно, так как вы не получили правильный день рождения (вы используете фиксированный день рождения). Вы должны изменить «23 марта 1988 года» на $ then
//Validate for users over 18 only function validateAge($then, $min) { // $then will first be a string-date $then = strtotime($then); //The age to be over, over +18 $min = strtotime('+18 years', $then); echo $min; if(time() < $min) { die('Not 18'); } }
Или вы можете:
// validate birthday function validateAge($birthday, $age = 18) { // $birthday can be UNIX_TIMESTAMP or just a string-date. if(is_string($birthday)) { $birthday = strtotime($birthday); } // check // 31536000 is the number of seconds in a 365 days year. if(time() - $birthday < $age * 31536000) { return false; } return true; }
Вот упрощенная выдержка из того, что я использовал для банковской системы в Торонто, и это всегда работало отлично, учитывая високосные годы 366 дней.
/* $dob is date of birth in format 1980-02-21 or 21 Feb 1980 * time() is current server unixtime * We convert $dob into unixtime, add 18 years, and check it against server's * current time to validate age of under 18 */ if (time() < strtotime('+18 years', strtotime($dob))) { echo 'Client is under 18 years of age.'; exit; }
if( strtotime("1988/03/23") < (time() - (18 * 60 * 60 * 24 * 365))) { print "yes"; } else { print "no"; }
… однако, не учитывая скачки
Я думаю, что для этого лучше использовать класс DateTime.
$bday = new DateTime("22-10-1993"); $bday->add(new DateInterval("P18Y")); //adds time interval of 18 years to bday //compare the added years to the current date if($bday < new DateTime()){ echo "over 18"; }else{ echo "below 18"; }
DateTime :: diff также может использоваться для сравнения даты с текущей датой.
$today = new DateTime(date("Ymd")); $bday = new DateTime("22-10-1993"); $interval = $today->diff($bday); if(intval($interval->y) > 18){ echo "older than 18"; }else{ echo "younger than 18"; }
N / B: 1) для второго метода, если $ bday больше, чем $ сегодня на 18 лет и более, он вернется старше, поэтому убедитесь, что введенная дата меньше $ сегодня. 2) DateTime работает на php 5.2.0 и выше
Php-файл
if (isset($_POST['bdate'])){ $bdate = $_POST['bdate']; $age = (date("Ymd") - $bdate); } //if age if 17 or younger error msg if ($age < 17) { echo "Must 18 or older."; } else{ //if age is 120 or greather error msg if ($age > 120) { echo "Real age please."; } else{ echo "$age"; } }
Код HTML:
<form action="" method="POST"> <p><label>Birth Date : </label> <input id="bdate" type="date" name="bdate" required placeholder="" /></p> <input class="btn register" type="submit" name="submit" value="Register" /> </form>