W3docs

checkdate()

Узнайте, как PHP-функция checkdate() проверяет месяц, день и год как дату григорианского календаря. Синтаксис, параметры, високосные годы и примеры.

Введение

Функция checkdate() проверяет, образуют ли месяц, день и год корректную дату по григорианскому календарю. Это простейший способ в PHP ответить на вопрос «29 февраля — реальная дата в этом году?» без разбора строк или создания объекта DateTime.

На этой странице рассматриваются синтаксис, параметры и возвращаемое значение checkdate(), обработка високосных лет и выходящих за допустимые границы значений, ограничение по диапазону лет, а также случаи, когда лучше использовать класс DateTime.

Синтаксис

checkdate(int $month, int $day, int $year): bool

Параметры

ПараметрОписание
$monthМесяц в виде целого числа. Допустимый диапазон: 1–12.
$dayДень месяца. Допустимый диапазон зависит от месяца и года — например, 30 допустимо для апреля, но не для февраля.
$yearГод в виде целого числа. Допустимый диапазон: 1–32767.

Возвращаемое значение

checkdate() возвращает true, если дата корректна, и false в противном случае. Дата считается корректной при выполнении всех условий: месяц находится в диапазоне 1–12, год — в диапазоне 1–32767, а день не превышает количество дней в указанном месяце указанного года (с учётом високосных лет).

Базовый пример

Чтобы проверить, является ли 29 февраля 2024 года корректной датой (2024 — високосный год, поэтому да):

php— editable, runs on the server

Скрипт сохраняет месяц, день и год в переменных, передаёт их в checkdate() и выводит сообщение на основе возвращённого boolean-значения.

Високосные годы и недопустимые дни

Главное преимущество checkdate() заключается в том, что функция знает количество дней в каждом месяце — включая правило о високосных годах для февраля. Одно и то же число дня может быть допустимым в одном году и недопустимым в другом:

<?php

var_dump(checkdate(2, 29, 2024)); // bool(true)  — 2024 is a leap year
var_dump(checkdate(2, 29, 2023)); // bool(false) — 2023 is not
var_dump(checkdate(4, 31, 2024)); // bool(false) — April has only 30 days
var_dump(checkdate(13, 1, 2024)); // bool(false) — month out of range
var_dump(checkdate(0, 1, 2024));  // bool(false) — month must be >= 1

Поскольку checkdate() выполняет эти проверки самостоятельно, вам не нужно жёстко прописывать, в каких месяцах 30 или 31 день.

Практическое применение: валидация данных формы

Типичная задача для checkdate() — отклонять невозможные даты, присланные из формы, до того как вы сохраните их или создадите объект DateTime:

<?php

function validateDate(int $month, int $day, int $year): string
{
    if (!checkdate($month, $day, $year)) {
        return "Please enter a real calendar date.";
    }

    return "Saved $year-$month-$day.";
}

echo validateDate(2, 30, 2024) . "\n"; // Please enter a real calendar date.
echo validateDate(12, 25, 2024) . "\n"; // Saved 2024-12-25.

Ограничение по диапазону лет и альтернатива DateTime

checkdate() принимает только годы в диапазоне 1–32767, что подходит для большинства задач, но не годится, если нужно работать с датами за пределами этого диапазона. Кроме того, функция принимает три отдельных целых числа, поэтому строку с датой придётся разбивать вручную.

Для обработки string-ввода или более строгой валидации используйте класс PHP DateTime. DateTime::createFromFormat() разбирает дату по заданному формату, а совместное использование с DateTime::getLastErrors() позволяет обнаруживать значения, которые PHP молча «переносит» (например, превращает 30 февраля в 1 или 2 марта):

<?php

$input = '2024-02-30';
$date = DateTime::createFromFormat('Y-m-d', $input);
$errors = DateTime::getLastErrors();

if ($date === false || $errors['warning_count'] > 0 || $errors['error_count'] > 0) {
    echo "Invalid date: $input";
} else {
    echo "Valid date: " . $date->format('Y-m-d');
}
// Output: Invalid date: 2024-02-30

Если у вас есть только месяц, день и год в виде целых чисел, checkdate() — более короткий выбор без сторонних зависимостей.

Связанные функции

  • mktime() — создать Unix-timestamp из отдельных частей даты.
  • date() — отформатировать timestamp в читаемую строку даты.
  • strtotime() — разобрать текстовое описание даты на английском в timestamp.
  • PHP Date and Time — обзор работы с датами в PHP.

Заключение

checkdate() — самый быстрый способ убедиться, что месяц, день и год образуют реальную дату по григорианскому календарю, с автоматическим учётом високосных лет. Помните об ограничении диапазона лет 1–32767 и переключайтесь на DateTime::createFromFormat(), когда нужно проверить строки с датами или работать за пределами этого диапазона.

Практика

Практика
Что можно проверить с помощью PHP-функции checkdate()?
Что можно проверить с помощью PHP-функции checkdate()?
Was this page helpful?