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

在文件错误消息的第26行中导致了类型为E_error的错误:未捕获异常:DateTime::u构造():未能分析时间字符串

楚帅
2023-03-14

在文件错误消息的第26行中导致类型E_error的错误:未捕获异常:DateTime::_构造():未能分析位置0({:意外字符)处的时间字符串({field:launche_date_1623800874977})

function time_elapsed_string($datetime, $full = false) {
    $now = get_field('event_date', false, false);
    $now = new DateTime();
    
    $ago = new DateTime($datetime);
    

    $diff = $now->diff($ago);

    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;

    $string = array(
        'y' => 'year',
        'm' => 'month',
        'w' => 'week',
        'd' => 'day',
    );
    foreach ($string as $k => &$v) {
        if ($diff->$k) {
            $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
        } else {
            unset($string[$k]);
        }
    }

    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' old' : 'NA';
}

请帮帮我。

共有1个答案

慕容光启
2023-03-14

问题:

  1. 仅仅依靠Date/Time库来猜测任意日期字符串的格式在任何语言中都是一个坏主意。在PHP中,您需要使用DateTime::createFromFormat()根据特定格式进行解析。
  2. 正如@digijay提到的,这不是一个可猜测的格式。
  3. 毫秒时间戳的问题是PHP的DateTime库将始终使用整个数字并将其解释为秒,无论您如何摆弄模式中的占位符。
  4. 对于DateTime构造函数来说,即使是以秒为单位的常规Unix时间戳也不是一种可猜测的格式。

因此,无论如何,在它进入您发布的函数之前,您需要对其进行预解析。

假设您已经从数据结构中骗取了时间戳:

$timestamp_ms = 1623800874977;
$timestamp = intdiv($timestamp_ms, 1000);

有两种方法可以将时间戳转换为日期时间:

$dt = DateTime::createFromFormat('U', $timestamp);
$dt = (new DateTime())->setTimestamp($timestamp);

现在,我更倾向于修改现有函数,以接受DateTime对象,而不是任意字符串,以适应此情况和其他“不可用”的边缘情况,在这种情况下,我们今天就完成了。但是,如果您有很多无法真正修改的周围代码,并且您真的希望将其混在一起,并传入一个正确的“可猜测”字符串:

$date_string = $dt->format('c');

其中,c是ISO8601格式说明符,ISO8601是一种易于识别且不会猜错的格式。例如:2021-06-15T23:47:54 00:00

 类似资料:
  • 我如何解决这个问题。 这是我的网站 这是完全的错误。 致命错误:未捕获的异常“exception”,消息为“DateTime::\u构造():无法分析位置0(0)处的时间字符串(03-22-2016):在/home/budweiser/public\u html/verify中出现意外字符”。php:13堆栈跟踪:#0/home/budweiser/public_html/verify。php(1

  • 我得到这个错误 (!)致命错误:未捕获异常'异常'与消息'DateTime::__construct():未能解析时间字符串(06-28-2014 07:43:58 )在位置0(0):意外字符'在 /Users/matt/Desktop/Likes/forgot/activate.php第17行 当你试图这么做的时候 第17行是

  • 昨天我在一个网站上工作,我们将使用。它工作得很好等等。然而,当我现在启动它,我得到一个错误... 我们从另一个网站获得信息,该网站发布的日期如下: 2016-30-24T11:30:00.000 01:00 然而,我们只想展示: 11:30:00 小时、分钟和秒。 我们采用以下方法: 这是昨天的工作,但现在我得到以下错误: 致命错误:未捕获异常'异常'与消息'DateTime::__constru

  • 我正在使用下面的函数计算从出生日期(欧洲格式DD/MM/YYYY)算起的人的年龄(以年为单位),这些日期作为文本存储在Wordpress高级自定义字段中 在大多数情况下,它工作正常,但在某些情况下,我得到以下错误: 工作正常的数据示例:$age=get_age($birthday); 对于$birth value=05/04/1946,它可以正常工作,但是对于$birth value=26/01/

  • 我正在尝试运行MySQL PDO查询。我不知道为什么我会得到一个致命的错误。我查过其他帖子,但他们的答案似乎并不能解决我的。 脚本连接到数据库很好。用户名和密码是正确的,我已经在下面的脚本中删除了它们。 我的输出:

  • 我在进行贝宝支付时出现了经验错误。 致命错误:未捕获异常“PayPal\exception\PayPalConnectionException”,消息为“访问https://api.sandbox.paypal.com/v1/payments/payment时获得Http响应代码400”。在C:\xampp\htdocs\paypal\workload\third_party\vendor\pay