Uncaught Exception: DateTime :: __ construct (): не удалось проанализировать строку времени - PullRequest
0 голосов
/ 17 февраля 2020

Я использую приведенную ниже функцию для расчета возраста (в годах) людей по датам рождения (в европейском формате ДД / ММ / ГГГГ), которые хранятся в виде текста в расширенных пользовательских полях Wordpress

function get_age($birthDate_old) {
    $birthDate = ($birthDate_old);
    return date_diff(new DateTime($birthDate), new DateTime('today'))->y;
}

В большинстве случаев работает нормально, но в некоторых случаях я получил ошибку ниже:

 Fatal error: Uncaught Exception: DateTime::__construct(): Failed to parse time string (26/01/1958) at position 0 (2): Unexpected character in /home/XXXX/functions.php:99 Stack trace: #0 /home/XXXX/functions.php(99): DateTime->__construct('26/01/1958') #1 /home/XXXX/single.php(69): get_age('26/01/1958') #2 /home/XXX/wp-includes/template-loader.php(98): include('/home/XXX/...') #3 /home/XXX/wp-blog-header.php(19): require_once('/home/XXX/...') #4 /home/XXX/index.php(17): require('/home/monmaire/...') #5 {main} thrown in /home/XXXX/functions.php on line 99

Пример данных, которые отлично работают: $ age = get_age ($ birthday);

Для значения $ birthday = 05.04.1946 это работает нормально, но для значения $ birthday = 26/01/1958 я получаю ошибку выше. Я не берусь за то, почему, поскольку данные мне кажутся одинаковыми в двух случаях.

Есть ли у вас какие-либо понятия, почему?

Спасибо. С уважением.

Ответы [ 3 ]

0 голосов
/ 17 февраля 2020

Я исправляю вашу функцию следующим образом:

function get_age($birthDate_old) {
    return date_diff(
        DateTime::createFromFormat('d/m/Y', $birthDate_old), 
        new DateTime('today')
    )->y;
}

В вашем случае ваша дата искажена, поскольку конструктор DateTime не знает, пропустили ли вы месяц или день.

05 / 04/1946 в порядке.

26 / 01/1958 не в порядке, потому что 26 представляют месяц по умолчанию.

0 голосов
/ 17 февраля 2020

Проблема в формате даты. Я полагаю, что вы переключаетесь между "/" и "-". Если вы имеете дело с большими данными, вам будет сложно исправить всю базу данных, поэтому я советую сделать preg_replace, чтобы всегда быть уверенным в том, что то, что вы берете от пользователя / БД, в правильном формате. Найдите пример кода ниже.

function get_age($birthDate_old) {
    $birthDate = ($birthDate_old);
    return date_diff(new DateTime($birthDate), new DateTime('today'))->y;
}


$birthDate = "26/01/1958";
$birthDate = preg_replace("(/)", "-", $birthDate);

echo get_age($birthDate);

Надеюсь, это поможет! Дайте мне знать

0 голосов
/ 17 февраля 2020

В соответствии с этим:

https://www.php.net/manual/en/datetime.formats.php

// THIS IS INVALID, WOULD IMPLY MONTH == 19
$external = "19/10/2016 14:48:21";

// HOWEVER WE CAN INJECT THE FORMATTING WHEN WE DECODE THE DATE
$format = "d/m/Y H:i:s";
$dateobj = DateTime::createFromFormat($format, $external);

$iso_datetime = $dateobj->format(Datetime::ATOM);
echo "SUCCESS: $external EQUALS ISO-8601 $iso_datetime";

26 рассматривается как месяц. Итак, добавьте $format = "d/m/Y"; к вашей дате, как указано выше.

...