PHP日期致命错误

3
这是我的函数:
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.
        )
)

您的日期/时间无效。 - John Conde
你可能正在尝试使用 format('Y-m-d\TH:i:s.u') 来设置一个制表符,请使用 \t\\t - Funk Forty Niner
@Fred-ii- 我想要一个 T,而不是制表符,就像 DateTime::ISO8601 中的那样。 - user3768051
@JohnConde 我的日期时间怎么会无效? - user3768051
DateTime::createFromFormat('U.u','1403538707.536290') 在版本 5.3.0 及以下无法工作。不过我不知道为什么会这样。 - Jim
@Jim 我正在使用 PHP 5.4。 - user3768051
1个回答

1
本地化影响sprintf的输出。显然,您收到此错误的位置使用逗号而不是小数点来分隔整数和小数位。 本质上,它试图执行以下操作:
DateTime::createFromFormat('U.u','1403538707,536290')

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

尝试使用 number_format 代替。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接