当前位置: 首页 > 知识库问答 >
问题:

未捕获异常:DateTime::\构造():无法分析时间字符串

唐修诚
2023-03-14

我正在使用下面的函数计算从出生日期(欧洲格式DD/MM/YYYY)算起的人的年龄(以年为单位),这些日期作为文本存储在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);

对于$birth value=05/04/1946,它可以正常工作,但是对于$birth value=26/01/1958,我得到了上面的错误。我不明白为什么,因为在我看来,这两个案例中的数据是相同的格式。

你知道为什么吗?

谢谢当做

共有3个答案

别浩漫
2023-03-14

问题是日期格式。我相信你在“/”和“-”之间切换。如果您正在处理大型数据,则很难修复整个数据库,因此我最好的建议是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);

我希望有帮助!让我知道

公良子轩
2023-03-14

据此:

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” 到您的日期,如上所述。

杜良骏
2023-03-14

我这样修复你的函数:

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

在你的情况下,你的日期是格式错误的,因为DateTime构造函数不知道你是通过一个月还是一天。

1946年4月5日可以。

1958年1月26日不正常,因为默认情况下26代表月份。

 类似资料: