Как преобразовать microtime () в HH: MM:SS: UU


Я измерял некоторые запросы curl и использовал microtime(true). Пример вывода будет 3.1745569706

Это 3.1745569706 секунды. Я хочу преобразовать это в несколько более читаемый формат, скажем 00:00:03:17455 (часы: минуты:секунды: миллисекунды)

$maxWaitTime = '3.1745569706';
echo gmdate("H:i:s.u", $maxWaitTime);

// which returns
00:00:01.000000

echo date("H:i:s.u" , $maxWaitTime)
// which returns
18:00:01.000000

Это выглядит неправильно. Я не совсем понимаю, чего мне здесь не хватает.

Как преобразовать microtime () в HH: MM:SS: UU ?

3 23

3 ответа:

Из PHP.net статья о date() который похож на gmdate(), за исключением того, что время возвращается в GMT:

Поскольку эта функция принимает только целочисленные метки времени, формат u символ полезен только при использовании функции date_format () с пользовательские временные метки, созданные с помощью функции date_create ().

Вместо этого используйте что-то вроде этого:

list($usec, $sec) = explode(' ', microtime()); //split the microtime on space
                                               //with two tokens $usec and $sec

$usec = str_replace("0.", ".", $usec);     //remove the leading '0.' from usec

print date('H:i:s', $sec) . $usec;       //appends the decimal portion of seconds

Который печатает: 00:00:03.1745569706

Если вы хотите, вы можете использовать round() для округления $usec var даже больше.

Если вы используете microtime(true) Используйте это вместо:

list($sec, $usec) = explode('.', microtime(true)); //split the microtime on .
<?php

function format_period($seconds_input)
{
  $hours = (int)($minutes = (int)($seconds = (int)($milliseconds = (int)($seconds_input * 1000)) / 1000) / 60) / 60;
  return $hours.':'.($minutes%60).':'.($seconds%60).(($milliseconds===0)?'':'.'.rtrim($milliseconds%1000, '0'));
}

echo format_period(3.1745569706);

Вывод

0:0:3.174

Предполагая, что человек действительно заботится о микросекундах, что, по общему признанию, редко, тогда он не должен использовать любое представление, которое включает в себя поплавки.

Вместо этого используйте функцию gettimeofday (), которая возвращает ассоциативный массив, содержащий секунды и микросекунды в виде целых чисел.

$g1 = gettimeofday();
# execute your process here
$g2 = gettimeofday();

$borrow  = $g2['usec'] < $g1['usec'] ;
$seconds = $g2['sec'] - $g1['sec'] - $borrow ;
$micros  = $borrow*1000000 + $g2['usec'] - $g1['usec'] ;
$delta   = gmdate( 'H:i:s.', $seconds ).sprintf( '%06d', $micros );