我有另一個開發人員撰寫的這個代碼片段
$date = DateTime::createFromFormat('U.u', microtime(TRUE));
$dateMicro = $date->format('Y-m-d H:i:s.u');
它拋出這個錯誤:
錯誤:在 bool 上呼叫成員函式 format()
我想這可能意味著 createFromFormat 回傳 false 但我不知道為什么會這樣做。
這可能是什么原因?
感謝您的時間!
uj5u.com熱心網友回復:
當回傳的微秒microtime(TRUE)為 0 時,這可能會失敗。
您可以使用以下腳本對其進行測驗
while (true) {
$time = microtime(TRUE);
// potential fix
// $time = sprintf('%.6f', microtime(TRUE));
echo $time , "\n";
$date = DateTime::createFromFormat('U.u', $time);
$dateMicro = $date->format('Y-m-d H:i:s.u');
}
輸出
...
1642510930.9999
1642510930.9999
1642510930.9999
1642510930.9999
1642510930.9999
1642510930.9999
1642510931
PHP Fatal error: Uncaught Error: Call to a member function format() on bool in .../test.php:7
Stack trace:
#0 {main}
thrown in .../test.php on line 7
uj5u.com熱心網友回復:
這是發生的事情:
將浮點數轉換為字串時(DateTime::createFromFormat期望字串的第二個引數):
- 如果有小數部分,PHP 只會添加小數部分
- 小數點后位數可以多于6
因此,您的代碼在這些情況下可能會失敗,因為DateTime::createFromFormat需要一個點后跟最多 6 位數字:
$date = DateTime::createFromFormat('U.u', 1642511198);
var_dump($date);
// bool(false)
$date = DateTime::createFromFormat('U.u', 1642511198.0000001);
var_dump($date);
// bool(false)
一個簡單的解決方案是使用sprintf函式:
$date = DateTime::createFromFormat('U.u', sprintf('%.6f', 1642511198));
var_dump($date);
// object(DateTime)#1 ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414299.html
標籤:
