23

我正在测量一些 curl 请求,我使用了microtime(true). 示例输出将是3.1745569706

这是3.1745569706几秒钟。我想将其转换为更易读的格式,比如说00:00:03:17455(HOURS:MINUTES:SECONDS:MILLISECONDS)

$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 ?

4

3 回答 3

27

来自与类似的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()$usecvar 进行更多的舍入。

如果您使用microtime(true)它来代替:

list($sec, $usec) = explode('.', microtime(true)); //split the microtime on .
于 2013-05-29T23:13:57.053 回答
7
<?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
于 2013-05-29T23:51:13.697 回答
0

假设一个人真的关心微秒,这是公认的罕见,那么一个人不应该使用任何涉及浮点数的表示。

而是使用 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 );
于 2018-06-02T02:35:30.273 回答