Как вычесть микротайм и отобразить дату с миллисекундами в php? - PullRequest
11 голосов
/ 21 февраля 2012

Как вычесть микротайм и отобразить дату с миллисекундами в php?

Например: я установил дату и время окончания

$endtime = 2012-02-21 10:29:59;

тогда у меня есть текущая дата или дата начала с конвертированным из микротайма

$starttime = 2012-02-21 10:27:59.452;

function getTimestamp()
{
        $microtime = floatval(substr((string)microtime(), 1, 8));
        $rounded = round($microtime, 3);
        return date("Y-m-d H:i:s") . substr((string)$rounded, 1, strlen($rounded));
}

echo getTimestamp(); //sample output 2012-02-21 10:27:59.452

Теперь я хочу вычесть: $ finaldate = $ endtime - $ starttime;

Я хочу, чтобы мой вывод был таким: 00: 00: 02.452

Ответы [ 2 ]

19 голосов
/ 21 февраля 2012

Вам необходимо использовать microtime для начальных / конечных значений и только отформатировать его для отображения в конце.

// Get the start time in microseconds, as a float value
$starttime = microtime(true);

/************/
/* Do stuff */
/************/

// Get the difference between start and end in microseconds, as a float value
$diff = microtime(true) - $starttime;

// Break the difference into seconds and microseconds
$sec = intval($diff);
$micro = $diff - $sec;

// Format the result as you want it
// $final will contain something like "00:00:02.452"
$final = strftime('%T', mktime(0, 0, $sec)) . str_replace('0.', '.', sprintf('%.3f', $micro));

Примечание: это возвращает значения с плавающей точкой из microtime и использует арифметику с плавающей точкой, чтобы упростить математику, поэтому ваши числа могут быть очень незначительными из-за проблемы округления с плавающей точкой, но вы округляете результат до 3 цифр в конце концов, в любом случае, и небольшие колебания тактовой частоты процессора больше, чем ошибки с плавающей запятой, так что это не проблема для вас на нескольких уровнях.

3 голосов
/ 21 февраля 2012

Ну, phpmyadmin использует этот код, чтобы вычислить время, затраченное на запрос.Это похоже на ваши требования:

//time before
list($usec, $sec) = explode(' ',microtime($starttime));
$querytime_before = ((float)$usec + (float)$sec);
/* your code */

//time after
list($usec, $sec) = explode(' ',microtime($endtime));
$querytime_after = ((float)$usec + (float)$sec);
$querytime = $querytime_after - $querytime_before;

Я думаю, это должно работать для вас.Вам просто нужно определить выходной формат

...