Question

J'ai un script qui prend une valeur en secondes (2 points décimaux de fractions de secondes):

$seconds_input = 23.75

Je convertir ensuite en millisecondes:

$milliseconds = $seconds_input * 1000; // --> 23750

Et puis je veux formater comme ceci:

H:M:S.x // --> 0:0:23.75

Où « x » est la fraction du second (mais de nombreux endroits après la virgule il y a).

Toute aide? Je ne peux pas sembler envelopper mon esprit autour de cela. J'ai essayé d'utiliser gmdate (), mais il a gardé élaguer les fractions de secondes.

Merci.

Était-ce utile?

La solution

Mon point

function formatSeconds( $seconds )
{
  $hours = 0;
  $milliseconds = str_replace( "0.", '', $seconds - floor( $seconds ) );

  if ( $seconds > 3600 )
  {
    $hours = floor( $seconds / 3600 );
  }
  $seconds = $seconds % 3600;


  return str_pad( $hours, 2, '0', STR_PAD_LEFT )
       . gmdate( ':i:s', $seconds )
       . ($milliseconds ? ".$milliseconds" : '')
  ;
}

Et le test

$testData = array(
    23,              // Seconds, w/o millis
    23.75,           // Seconds, w/millis
    23.75123456789,  // Lots of millis
    123456789.75    // Lots of seconds
);

foreach ( $testData as $seconds )
{
  echo formatSeconds( $seconds ), PHP_EOL;
}

ce qui donne

00:00:23
00:00:23.75
00:00:23.75123456789
34293:33:09.75

Autres conseils

Modifier Eh bien, j'étais un peu hâtive. Voici une façon de faire ce que vous demandez:

function formatMilliseconds($milliseconds) {
    $seconds = floor($milliseconds / 1000);
    $minutes = floor($seconds / 60);
    $hours = floor($minutes / 60);
    $milliseconds = $milliseconds % 1000;
    $seconds = $seconds % 60;
    $minutes = $minutes % 60;

    $format = '%u:%02u:%02u.%03u';
    $time = sprintf($format, $hours, $minutes, $seconds, $milliseconds);
    return rtrim($time, '0');
}

mine est beaucoup moins lisible, il doit donc être mieux. : P

Au fond la même idée que la version @ ircmaxell. Il fait couper le traînantes « 0 et de même sautera le dernier » « . séparateur si millisecondes sont 0.

<?

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

si vous voulez vraiment le faire en utilisant la fonction de date que vous avez raison, vous devez traiter avec millisecondes à l'extérieur, ne repose que sur la deuxième-horodatages.

vous pouvez faire quelque chose comme ceci:

<?
$input = "23.75";
$seconds = floor($input);
$date = DateTime::createFromFormat('s', floor($seconds));
$ms = ($input-$seconds);
if($ms == 0) {
$ms = "";
} else { 
$ms = ltrim($ms,"0,");
}
echo $date->format('H:i:s').$ms;

mais être conscient de l'heure-débordement, si vos heures dépasse 24, vous finirez probablement jeter les jours.

dans votre cas, je dirais que votre approche avec plancher pour obtenir les secondes est correct, et alors vous devriez probablement utiliser modulo Arithmétique comme ceci:

<?
$totalsecs = 86400*10;

$secs = $totalsecs%60;

echo "secs: $secs \n";

$minutes = ($totalsecs - $secs) % (60*60);

?> et ainsi de suite ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top