Laravel Live Japan

DateTimeImmutable::getLastErrors

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::getLastErrorsВозвращает предупреждения и ошибки

Описание

public static DateTimeImmutable::getLastErrors(): array|false

Метод возвращает массив предупреждений и ошибок, которые обнаружил при разборе строки с датой и временем.

Список параметров

Сигнатура функции не содержит параметров.

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

Метод возвращает массив, который содержит информацию о предупреждениях и ошибках, или false, если нет ни предупреждений, ни ошибок.

Список изменений

Версия Описание
8.2.0 До версии PHP 8.2.0 метод не возвращал false, когда не было предупреждений или ошибок. Вместо этого метод каждый раз возвращал задокументированную структуру массива.

Примеры

Пример #1 Пример получения ошибки разбора строки с датой и временем методом DateTimeImmutable::getLastErrors()

<?php

try {
$date = new DateTimeImmutable('asdfasdf');
} catch (
Exception $e) {
// Обработка исключения таким способом приводится только в демонстрационных целях…
print_r(DateTimeImmutable::getLastErrors());

// …в объектно-ориентированном стиле лучше выводить сообщение вот так:
echo $e->getMessage();
}

Результат выполнения приведённого примера:

Array
(
    [warning_count] => 1
    [warnings] => Array
        (
            [6] => Double timezone specification
        )

    [error_count] => 1
    [errors] => Array
        (
            [0] => The timezone could not be found in the database
        )

)
Failed to parse time string (asdfasdf) at position 0 (a): The timezone could not be found in the database

Индексы 6 и 0 в выводе примера относятся к индексу символа в строке разбора, на котором возникла ошибка.

Пример #2 Пример обнаружения переполнения дат

<?php

$date
= DateTimeImmutable::createFromFormat('!Y-m-d', '2020-02-30');
print_r(DateTimeImmutable::getLastErrors());

Результат выполнения приведённого примера:

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

    [error_count] => 0
    [errors] => Array
        (
        )
)
Добавить

Примечания пользователей 1 note

up
-1
_mittens
2 years ago
If you are curious as to when the internal array gets resetted (from https://onlinephp.io/c/3ee35):

<?php

$date0 = DateTimeImmutable::createFromFormat('!Y-m-d', '2020-31-31');
var_dump($date0->format('c')); // 2022-07-31T00:00:00+00:00

foreach(range(0,2) as $_)
    // The internal error won't reset
    var_dump( join(DateTimeImmutable::getLastErrors()['warnings']) ); // The parsed date was invalid
    
$date1 = DateTimeImmutable::createFromFormat('!Y-m-d', '2020-12-31');
var_dump($date1->format('c')); // 2020-12-31T00:00:00+00:00

// The internal error did reset
var_dump( empty(DateTimeImmutable::getLastErrors()['warnings']) ); // true

$date2 = DateTimeImmutable::createFromFormat('!Y-m-d', '2020-31-31');
var_dump( join(DateTimeImmutable::getLastErrors()['warnings']) ); // The parsed date was invalid
$date3 = new DateTimeImmutable('2023-12-31T00:00:00.000000Z');

// The internal error did reset
var_dump( empty(DateTimeImmutable::getLastErrors()['warnings']) ); // true
?>

Output:
string(25) "2022-07-31T00:00:00+00:00"
string(27) "The parsed date was invalid"
string(27) "The parsed date was invalid"
string(27) "The parsed date was invalid"
string(25) "2020-12-31T00:00:00+00:00"
bool(true)
string(27) "The parsed date was invalid"
bool(true)
To Top