PHP - millisecondes Convertir en heures: minutes: Seconds.fractional
-
16-10-2019 - |
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.
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 ..