【问题标题】:php fatal error with date带有日期的php致命错误
【发布时间】:2025-12-09 20:50:02
【问题描述】:

这是我的功能:

public static function GetFormattedMicroTime($timestamp = false) {
    if(!$timestamp)
        $timestamp = microtime(true);
    return DateTime::createFromFormat('U.u',sprintf('%.f', $timestamp))->format('Y-m-d\TH:i:s.u');
}

我就是这样称呼它的(我只在我的代码中的一个地方调用它):

$microtime = microtime(true);
$sinceLastLog = number_format($microtime - self::$lastLogTime,4);
self::$lastLogTime = $microtime;
return Utils::GetFormattedMicroTime($microtime) .'|'. $sinceLastLog .'| blah blah';

我得到了很多:

PHP 消息:PHP 致命错误:在非对象上调用成员函数 format()

谁能帮我解决问题?

编辑:

我正在使用 php-fpm 5.4.28

我稍微改变了我的功能:

public static function GetFormattedMicroTime($timestamp = false) {
    if(!$timestamp)
        $timestamp = microtime(true);

    $d = DateTime::createFromFormat('U.u',sprintf('%.f', $timestamp));
    if ($d instanceof DateTime){
        return $d->format('Y-m-d\TH:i:s.u');
    } else {
        error_log("Erreur date ! timestamp = $timestamp erreur =".print_r(DateTime::getLastErrors(),true));
        return $timestamp;
    }
}

现在我正在进入 nginx 日志:

PHP message: Erreur date ! timestamp = 1403539343,372 erreur = Array
(
    [warning_count] => 0
    [warnings] => Array
        (
        )
    [error_count] => 2
    [errors] => Array
        (
            [10] => Unexpected data found.
        )
)

【问题讨论】:

  • 您的日期/时间无效
  • 您可能正在尝试使用format('Y-m-d\TH:i:s.u') 使用\t\\t 设置标签
  • @Fred-ii- 我想要一个 T,而不是一个选项卡,就像在 DateTime::ISO8601 中一样
  • @JohnConde 我的日期时间怎么会无效?
  • DateTime::createFromFormat('U.u','1403538707.536290') 不适用于 5.3.0 及以下版本。但是我不知道为什么会这样。

标签: php datetime


【解决方案1】:

语言环境会影响sprintf 的输出。显然,无论您从哪里得到这个错误,都有一个使用逗号而不是小数点来分隔整数和小数位的语言环境。本质上,它正在尝试这样做:

DateTime::createFromFormat('U.u','1403538707,536290')

createFromFormat 只是将其视为小数点字符,而不是区域设置的小数分隔符。

尝试改用number_format

DateTime::createFromFormat('U.u', number_format($timestamp, 6, '.', ''));

【讨论】: