web-dev-qa-db-ja.com

microtime()をHH:MM:SS:UUに変換する方法

いくつかの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に変換するにはどうすればよいですか?

23
ProDraz

PHP.netのdate()に関する記事 から。これはgmdate()に似ていますが、時間はGMTで返されます。

この関数は整数タイムスタンプのみを受け入れるため、u形式文字は、date_create()で作成されたユーザーベースのタイムスタンプでdate_format()関数を使用する場合にのみ役立ちます。

代わりに次のようなものを使用してください。

_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 .
_
26
edwardmp
<?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);

[〜#〜] output [〜#〜]

0:0:3.174
6
Yogus

確かにまれであるマイクロ秒を本当に気にしていると仮定すると、フロートを含む表現を使用すべきではありません。

代わりに、整数として秒とマイクロ秒を含む連想配列を返す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 );
0
Jeff