PHP致命错误:调用布尔值的成员函数format()


PHP Fatal error: Call to a member function format() on boolean

崩溃:

<?php 
    $date = "13-06-2015 23:45:52";
    echo Datetime::createFromFormat('d-m-Y h:i:s',  $date)->format('Y-m-d h:i:s'); 
?>

PHP致命错误:在boolean

上调用成员函数format()

但在其他日期也可以:

<?php 
    $date = "10.06.2015 09:25:52";
    echo Datetime::createFromFormat('d-m-Y h:i:s',  $date)->format('Y-m-d h:i:s');
?>

错误的格式?

当你有多个错误时,这两个例子都不起作用:

  1. 您忘记了第二个参数Datetime::createFromFormat()
  2. h:i:s应该是H:i:s
  3. 第二个示例中的日期由.分隔,而不是-

修复:

<?php 
    $date = "13-06-2015 23:45:52";
    echo DateTime::createFromFormat('d-m-Y H:i:s', $date)->format('Y-m-d h:i:s'); 
    $date = "10.06.2015 09:25:52";
    echo DateTime::createFromFormat('d.m.Y H:i:s', $date)->format('Y-m-d h:i:s');
?>

在我的情况下,我得到这个错误,因为我使用microtime(true)作为输入:

$now = DateTime::createFromFormat('U.u', microtime(true));

microtime返回小数为0的浮点数的特定时刻,出现此错误。

所以我必须验证它是否为小数,并添加小数部分:

$aux = microtime(true);
$decimais = $aux - floor($aux);
if($decimais<=10e-5) $aux += 0.1; 
$now = DateTime::createFromFormat('U.u', $aux);

编辑:

由于浮点精度,有时地板会带来不正确的地板,所以我不得不使用更直接的方法:

$aux =  microtime(true);
$now = DateTime::createFromFormat('U.u', $aux);        
if (is_bool($now)) $now = DateTime::createFromFormat('U.u', $aux += 0.001);

当其他人试图用一个特定的用例来回答这个问题时,我认为是时候用一个通用的答案来结束它了。

Fatal error: Uncaught error:调用成员函数format() on bool in path/to/source/code/file.php

当这个异常错误被抛出时,这是因为format()函数得到了一个错误的日期格式字符串。因此,尝试根据https://www.php.net/manual/en/datetime.createfromformat.php#format

检查参数

在我的例子中,我从输入字段发送了一个空值,并得到了错误

解决方案:

if ($this->input->post('date_fo_return') != "") {
        $date_fo_return = $this->input->post('date_fo_return');
    $date_fo_return2 = DateTime::createFromFormat('d/m/Y', $date_fo_return);
    $data['date_fo_return'] = $date_fo_return2->format("Y-m-d H:i:s");
    }

John Conde的答案是正确的。如果我们忘记了这些错误,则会出现错误,因为提供的输入不符合格式字符串。

的例子:

DateTime::createFromFormat('D M j h:i:s e Y','Fri Nov  4 12:59:59 UTC 2022');

将返回一个DateTime对象,而following将返回false

DateTime::createFromFormat('D M j h:i:s e Y','Fri Nov  4 13:00:01 UTC 2022');

罪魁祸首是格式字符串'D M j h:i:s e Y'中的字母'h'。对于12小时格式,即13:00:01,您必须使用大写的'H'

如果你看一下文档,你可以看到区别。

h:带前导零的12小时格式

H:带前导零的24小时格式

基本上如果你看这个函数Datetime::createFromFormat,你会发现函数有两个可能的返回值,它们是DateTime对象和false

由于false值无效而调用format函数而发生致命错误。

因此,您应该首先检查返回值,然后适当地继续该过程。不仅适用于这种情况(datetime),还适用于具有多个可能返回值的其他函数。