崩溃:
<?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');
?>
错误的格式?
当你有多个错误时,这两个例子都不起作用:
- 您忘记了第二个参数
Datetime::createFromFormat()
-
h:i:s
应该是H:i:s
- 第二个示例中的日期由
.
分隔,而不是-
修复:
<?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),还适用于具有多个可能返回值的其他函数。