簡體   English   中英

PHP 致命錯誤:調用成員 function format() on boolean

[英]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 致命錯誤:調用成員 function format() on boolean

但是對於其他日期效果很好:

<?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返回一個只有零作為小數的浮點數的特定時刻,出現了這個錯誤。

所以我不得不驗證它是否是小數並添加一個小數部分:

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

編輯

由於浮點精度有時 floor 會帶來 incorret floor,所以我不得不使用更直接的方法:

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

雖然其他人試圖通過特定用例來回答這個問題,但我認為是時候用一個通用的答案來結束它了。

致命錯誤:未捕獲錯誤:在 path/to/source/code/file.php 中調用 bool 上的成員函數 format()

引發此異常錯誤時,是因為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");
    }

約翰康德的回答是正確的。 如果我們忘記了錯誤,就會出現錯誤,因為提供的輸入不符合格式字符串。

例子:

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

將返回 DateTime object 而以下將返回false

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

罪魁禍首是格式字符串'DM jh:i:se Y'中的字母'h' '。 對於 13:00:01 的 12 小時格式,您必須使用大寫字母'H'

如果您查看文檔,您會發現其中的區別。

h :帶前導零的小時的 12 小時格式

H :帶前導零的小時的 24 小時格式

基本上,如果您查看這個 function Datetime::createFromFormat ,您會發現 function 有 2 個可能的返回值,它們是DateTime object 和false

發生該致命錯誤是因為您對無效的false值調用 function format

所以你應該先檢查返回值,然后適當地繼續這個過程。 不僅適用於這種情況(日期時間),而且適用於具有多個可能返回值的其他函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM