PHP Преобразование секунд в ММ: ДД: ЧЧ: ММ: СС

Мне нужна помощь в преобразовании секунд в формат MM:DD:HH:MM:SS.

У меня есть этот код здесь:

<?php
    // Convert seconds into months, days, hours, minutes, and seconds.
    function secondsToTime($ss) {
    $s = $ss%60;
    $m = floor(($ss%3600)/60);
    $h = floor(($ss%86400)/3600);
    $d = floor(($ss%2592000)/86400);
    $M = floor($ss/2592000);

    return "$M months, $d days, $h hours, $m minutes, $s seconds";
    }
?>

Он выводит пример

0 месяцев, 1 день, 3 часа, 46 минут, 39 секунд

Я просто хотел бы, чтобы это было что-то вроде

00:01:03:46:39

Как я могу это сделать?


person Wesley    schedule 06.02.2013    source источник
comment
вместо этого использовать date()?   -  person nice ass    schedule 06.02.2013
comment
что такое $ss, через который вы проходите? целое число (отметка времени) ?   -  person swapnesh    schedule 06.02.2013
comment
Делая то, что предлагает @OneTrickPony, или используя strftime(), вам будет намного проще. Не нужно изобретать велосипед.   -  person inhan    schedule 06.02.2013
comment
есть веская причина, почему вы переделываете это? У @OneTrickPony есть хорошее решение, если вы этого не сделаете.   -  person BOMEz    schedule 06.02.2013
comment
Я использую целое число, извлеченное из БД по нескольким строкам с помощью оператора while. Это страница ранжирования по времени воспроизведения.   -  person Wesley    schedule 06.02.2013
comment
Почему бы вам просто не удалить months, days, hours, minutes, seconds из кода и заменить их на :?   -  person Ari    schedule 17.12.2013


Ответы (3)


Из того, что я понял, похоже, что вы заинтересованы в возврате строки со значениями, содержащими две цифры, разделенные двоеточием. Предполагая, что позиционирование не нужно менять, вы можете сделать что-то похожее на следующее:

<?php
// Prefix single-digit values with a zero.
function ensure2Digit($number) {
    if($number < 10) {
        $number = '0' . $number;
    }
    return $number;
}

// Convert seconds into months, days, hours, minutes, and seconds.
function secondsToTime($ss) {
    $s = ensure2Digit($ss%60);
    $m = ensure2Digit(floor(($ss%3600)/60));
    $h = ensure2Digit(floor(($ss%86400)/3600));
    $d = ensure2Digit(floor(($ss%2592000)/86400));
    $M = ensure2Digit(floor($ss/2592000));

    return "$M:$d:$h:$m:$s";
}

Или, если вам не нравится идея иметь еще одну функцию для управления, возможно, это может подойти вам лучше:

<?php
// Convert seconds into months, days, hours, minutes, and seconds.
function secondsToTime($ss) {
    $s = $ss%60;
    $m = floor(($ss%3600)/60);
    $h = floor(($ss%86400)/3600);
    $d = floor(($ss%2592000)/86400);
    $M = floor($ss/2592000);

    // Ensure all values are 2 digits, prepending zero if necessary.
    $s = $s < 10 ? '0' . $s : $s;
    $m = $m < 10 ? '0' . $m : $m;
    $h = $h < 10 ? '0' . $h : $h;
    $d = $d < 10 ? '0' . $d : $d;
    $M = $M < 10 ? '0' . $M : $M;

    return "$M:$d:$h:$m:$s";
}

А затем вызвать нашу функцию (в зависимости от того, какой метод вы решите использовать):

<?php

$ss = 123456;
print secondsToTime($ss);

?>
person Joshua Burns    schedule 06.02.2013
comment
Просто альтернатива: substr('0'.$someInteger,-2) дает вам 2-значный результат - person inhan; 06.02.2013
comment
немного хакерский, но да, это также дало бы желаемый эффект префикса с нулем, когда это необходимо. :) - person Joshua Burns; 06.02.2013
comment
Спасибо за оба этих ответа! Я никогда не знал, что ты можешь так поступить. Я буду использовать его в учебных целях (: - person Wesley; 06.02.2013
comment
Вы пропустили ( во второй функции. Это нужно правильно или нужно удалить другое )? - person Wesley; 06.02.2013
comment
вы правы, у меня был ), которого не должно было быть. фиксированный. - person Joshua Burns; 06.02.2013
comment
Как можно отобразить результат? - person Ole Sørensen; 28.12.2013
comment
@ОлеСоренсен: <?php print secondsToTime(123456);?> - person Joshua Burns; 30.12.2013

Простой способ:

print date('m:d:h:i:s', $ss); // $ss = seconds

Однако, насколько я знаю, это не может обрабатывать годы так, как вы этого хотите, потому что он начнет отсчет с 1970 года. Но, очевидно, вам не нужно отображать годы.

В качестве альтернативы вы можете просто отформатировать текущую строку с помощью (s)printf:

printf('%02d:%02d:%02d:%02d:%02d', $M, $d, $h, $m, $s);
person nice ass    schedule 06.02.2013
comment
Я использую оператор while, чтобы получить секунды из нескольких строк. Printf и print по какой-то причине установили результат в верхней части моей таблицы. - person Wesley; 06.02.2013
comment
Это потому, что printf печатает строку при ее вызове. Используйте sprintf, если вы хотите вернуть его в свою функцию, и распечатать позже - person nice ass; 06.02.2013
comment
Я попробовал sprintf, как вы сказали, но полученные данные даже не появились. - person Wesley; 06.02.2013
comment
Вам нужно было заменить строку return из вашей функции на return sprintf ... - person nice ass; 06.02.2013

Учитывая все ваши переменные, вы можете просто создать строку с помощью PHP:

$str = "$M:$d:$h:$m:$s"

Однако этот код не будет обрабатывать ведущие нули.

person parker.sikand    schedule 06.02.2013
comment
Без обид, но я это знал. Я хотел ведущие нули, хотя. - person Wesley; 06.02.2013