Решение от: https://gist.github.com/SteveJobzniak/c91a8e2426bac5cb9b0cbc1bdbc45e4b
Вот очень чистый и короткий метод!
Этот код максимально избегает утомительных вызовов функций и пошаговых строковыхздание, и большие и громоздкие функции, которые люди делают для этого.
Он производит формат "1h05m00s" и использует ведущие нули в течение минут и секунд, пока им предшествует другой ненулевой компонент времени.
И он пропускает все пустые ведущие компоненты, чтобы избежать предоставления вам бесполезной информации, такой как "0h00m01s" (вместо этого она будет отображаться как "1s").
Пример результатов: "1s", "1m00s"," 19m08s "," 1h00m00s "," 4h08m39s ".
$duration = 1; // values 0 and higher are supported!
$converted = [
'hours' => floor( $duration / 3600 ),
'minutes' => floor( ( $duration / 60 ) % 60 ),
'seconds' => ( $duration % 60 )
];
$result = ltrim( sprintf( '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ), '0hm' );
if( $result == 's' ) { $result = '0s'; }
Если вы хотите сделать код еще короче (но менее читабельным), вы можете избежать массива $converted
ивместо этого поместите значения непосредственно в вызов sprintf () следующим образом:
$duration = 1; // values 0 and higher are supported!
$result = ltrim( sprintf( '%02dh%02dm%02ds', floor( $duration / 3600 ), floor( ( $duration / 60 ) % 60 ), ( $duration % 60 ) ), '0hm' );
if( $result == 's' ) { $result = '0s'; }
Длительность должна быть 0 или выше в в обоих фрагментов кода выше.Отрицательные длительности не поддерживаются.Но вы можете обрабатывать отрицательные длительности, используя вместо этого следующий альтернативный код:
$duration = -493; // negative values are supported!
$wasNegative = FALSE;
if( $duration < 0 ) { $wasNegative = TRUE; $duration = abs( $duration ); }
$converted = [
'hours' => floor( $duration / 3600 ),
'minutes' => floor( ( $duration / 60 ) % 60 ),
'seconds' => ( $duration % 60 )
];
$result = ltrim( sprintf( '%02dh%02dm%02ds', $converted['hours'], $converted['minutes'], $converted['seconds'] ), '0hm' );
if( $result == 's' ) { $result = '0s'; }
if( $wasNegative ) { $result = "-{$result}"; }
// $result is now "-8m13s"