web-dev-qa-db-fra.com

Comment convertir microtime () en HH: MM: SS: UU

Je mesurais certaines demandes de boucles et j’utilisais microtime(true). L'exemple de sortie serait 3.1745569706

Ceci est 3.1745569706 secondes. Je veux convertir cela en un format un peu plus lisible, disons 00:00:03:17455 (HEURES: MINUTES: SECONDES: 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

Cela semble faux. Je ne suis pas tout à fait sûr de ce que je manque ici.

Comment convertir microtime () en HH: MM: SS: UU?

23
ProDraz

Extrait de l'article PHP.net sur date() qui est similaire à gmdate(), sauf que l'heure est renvoyée à l'heure GMT:

Puisque cette fonction accepte uniquement les horodatages entiers, le format u Ce caractère n'est utile que lorsque vous utilisez la fonction date_format () avec horodatages basés sur l'utilisateur créés avec date_create ().

Utilisez quelque chose comme ceci à la place:

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

Quelles impressions: 00:00:03.1745569706

Si vous le souhaitez, vous pouvez utiliser round() pour arrondir encore davantage le $usec var.

Si vous utilisez microtime(true), utilisez ceci à la place:

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);

SORTIE

0:0:3.174
6
Yogus

En supposant que l’on se soucie vraiment des microsecondes, ce qui est certes rare, il ne faut pas utiliser de représentation qui implique des flottants.

Utilisez plutôt gettimeofday () qui renverra un tableau associatif contenant les secondes et les microsecondes sous forme d’entiers.

$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