Проверка корректности даты

Задача
Необходимо проверить корректность даты. Например, убедиться, что пользователь не ввел определенную дату рождения, например 30 февраля 1962 года.

Решение
Проверяется с помощью функции checkdate():

$valid = checkdate($month,$day,$year);

Обсуждение
Функция checkdate() возвращает true, если переменная $month имеет значение между 1 и 12, переменная $year имеет значение между 1 и 32767, а переменная $day находится в интервале от 1 до корректного максимального числа дней для переменных $month и $year. Високосные года корректно обрабатываются с помощью функции checkdate(), при этом даты представляются с использованием Григорианского календаря. Функция checkdate() поддерживает весьма широкий диапазон допустимых лет, поэтому необходима дополнительная проверка пользовательского ввода, если, например, ожидается ввод даты рождения. Книга мировых рекордов Гиннеса утверждает, что возраст старейшего жителя когда-то достиг 122 лет. Убедиться, что дата рождения пользователя находится в пределах между 18 и 122 годами, можно посредством функции pc_checkbirthdate().

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;
}
}

Далее приведено несколько способов применения:
// проверка даты 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 равно $max_year (например в 2002 году переменная $year равна 1984), то значение переменной $month должно быть меньше номера текущего месяца. Если значение переменной $month равно номеру текущего месяца, то значение переменной $day должно быть меньше или равно номеру текущего дня. Если значение переменной $year равно $min_year (например в 2002 году переменная $year равна 1880), то значение переменной $month должно превышать номер текущего месяца. Если значение переменной $month равно номеру текущего месяца, то значение переменной $day должно быть больше номера текущего дня. Если не выполняется ни одно из этих условий, то введенная дата находится вне соответствующего диапазона, и функция возвращает false. Функция возвращает true, если введенная дата отстает от текущей ровно на $min_age лет, но возвращает false, если введенная дата опережает текущую ровно на $max_age лет.


Другими словами, это 18-й день рождения, а не 123-й.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Вывод на печать даты и времени в определенном формате
Выделение дат и времен из строк
Выработка высокоточного времени
Определение дня недели, месяца, года или номера недели в году
Определение разности между датами юлианского календаря

Вернуться в раздел: PHP / 3. Дата и время