W3docs

Функция date_get_last_errors() в PHP

Узнайте, как использовать функцию date_get_last_errors() в PHP для отладки ошибок и предупреждений при работе с датами.

Устали разбираться с ошибками, связанными с датами, в вашем PHP-коде? Тогда вам повезло. Функция date_get_last_errors() в PHP создана специально для этого.

В этой статье мы подробно рассмотрим, как работает функция date_get_last_errors(), её параметры и то, как использовать её для отладки проблем с датами в PHP-коде.

Что такое функция date_get_last_errors()?

Функция date_get_last_errors() — это встроенная функция PHP (доступна начиная с PHP 5.2.0), которая позволяет получить информацию о последней ошибке или предупреждении, связанном с датой. Она возвращает ассоциативный array, содержащий warning_count, warnings, error_count и errors — конкретные коды и текстовые описания того, что пошло не так во время последней операции с датой и временем.

Как использовать date_get_last_errors()

Чтобы использовать функцию date_get_last_errors(), вызывайте её после того, как функция создания или изменения даты завершилась неудачей. В продакшн-коде всегда следует проверять, что функция даты вернула false, прежде чем получать подробности об ошибке. Вот пример:

php— editable, runs on the server

В этом примере мы пытаемся создать объект даты из строки '2022-13-01', которая является недопустимым значением даты (месяц 13 не существует). Убедившись, что date_create_from_format() вернула false, мы вызываем date_get_last_errors() и выводим возвращённый array с помощью print_r().

Вывод этого кода будет следующим:

Array
(
    [warning_count] => 1
    [warnings] => Array
        (
            [10] => The parsed date was invalid
        )

    [error_count] => 0
    [errors] => Array
        (
        )

)

Как видите, возвращённый array разделяет предупреждения и ошибки:

  • Ошибки означают, что входные данные не удалось разобрать вовсе (например, посторонний символ или формат, не совпадающий со строкой).
  • Предупреждения означают, что строка была разобрана, но результат вызывает сомнения — например, компонент вышел за допустимые пределы. Месяц 13 не существует, поэтому PHP переносит или отклоняет его и выдаёт предупреждение [10] => The parsed date was invalid.

Важно: возвращаемое значение при отсутствии ошибок

Распространённая ловушка состоит в том, что возвращаемое значение изменилось в разных версиях PHP:

  • PHP 5.2 – 8.1: всегда возвращает ассоциативный array, где warning_count и error_count равны 0, если всё прошло нормально.
  • PHP 8.2 и выше: возвращает false (boolean), если предыдущая операция с датой не породила ни предупреждений, ни ошибок.

Именно поэтому следует ветвить логику на основе результата самой функции даты, а не date_get_last_errors():

<?php
// A valid date — parsing succeeds.
$result = date_create_from_format('Y-m-d', '2022-01-15');

if ($result === false) {
    // This branch is skipped because the date is valid.
    print_r(date_get_last_errors());
} else {
    echo "Parsed successfully: " . $result->format('Y-m-d');
}
?>

Вывод:

Parsed successfully: 2022-01-15

Поскольку $result является допустимым объектом DateTime, мы никогда не вызываем date_get_last_errors() — полностью избегая зависящего от версии сюрприза с false против array.

Практический рабочий процесс отладки

При обработке разбора дат в продакшне следуйте этой схеме для безопасного захвата и журналирования проблем:

  1. Вызовите функцию создания даты (например, date_create_from_format() или DateTime::createFromFormat()).
  2. Проверьте, равен ли результат false.
  3. Если false, вызовите date_get_last_errors() для проверки массивов warnings и errors.
  4. Журналируйте или отображайте конкретные коды предупреждений/ошибок и сообщения, чтобы определить точную проблему разбора, не останавливая работу приложения.

Параметры

Функция date_get_last_errors() не принимает параметров. Она просто возвращает информацию о последней ошибке или предупреждении, связанном с датой (ассоциативный array или false в PHP 8.2+, если ошибок не было).

Объектно-ориентированный эквивалент

Если вы работаете с классом DateTime вместо процедурных функций, та же информация доступна через статический метод DateTime::getLastErrors():

<?php
$result = DateTime::createFromFormat('Y-m-d', 'not-a-date');

if ($result === false) {
    print_r(DateTime::getLastErrors());
}
?>

Вывод:

Array
(
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 3
    [errors] => Array
        (
            [0] => A four digit year could not be found
            [10] => Not enough data available to satisfy format
        )

)

На этот раз строка вовсе не поддаётся разбору, поэтому проблемы сообщаются как ошибки (не предупреждения). DateTime::getLastErrors() возвращает идентичную структуру, что и date_get_last_errors(), и следует тем же правилам версионирования, описанным выше.

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

  • date_create_from_format() — разбор строки даты по явному формату; функция, чьи ошибки вы здесь проверяете.
  • date_create() — создание объекта DateTime из гибкой строки даты.
  • checkdate() — проверка григорианской даты перед попыткой её разбора.
  • date() — форматирование метки времени, когда у вас уже есть допустимая дата.

Заключение

Функция date_get_last_errors() — ценный инструмент для любого PHP-разработчика, которому нужно отлаживать ошибки, связанные с датами. Открывая конкретное предупреждение или ошибку, возникшую во время последней операции с датой/временем, она позволяет отлаживать проблемы разбора, не останавливая работу приложения. Запомните две ключевые привычки: всегда ветвьтесь на основе собственного возвращаемого значения функции даты (false) и учитывайте изменение в PHP 8.2+, где сама date_get_last_errors() возвращает false, если всё прошло нормально.

Практика

Практика
Что делает функция date_get_last_errors() в PHP?
Что делает функция date_get_last_errors() в PHP?
Was this page helpful?