Как конвертировать секунды в формат времени?

По какой-то причине я конвертирую формат времени, например: 03:30 to seconds 3*3600 + 30*60, now. Я хочу преобразовать его обратно в свой первый (такой же) формат там. Как это могло быть?

Моя попытка:

3*3600 + 30*60 = 12600 

12600 / 60 = 210 / 60 = 3.5, floor(3.5) = 3 = hour

Теперь, как насчет минут?

Учитывая, что значение может быть как 19:00 or 02:51. Я думаю, вы получили картину.

И, кстати, как конвертировать 2:0 for example to 02:00 using RegEx?

Ответ 1

$hours = floor($seconds / 3600);
$mins = floor($seconds / 60 % 60);
$secs = floor($seconds % 60);

Если вы хотите получить формат времени:

$timeFormat = sprintf('%02d:%02d:%02d', $hours, $mins, $secs);

Ответ 2

Это может быть проще

gmdate("H:i:s", $seconds)

PHP gmdate

Ответ 3

Если вам известно, что время будет меньше часа, вы можете просто использовать функции date() или $date->format().

$minsandsecs = date('i:s',$numberofsecs);

Это работает, потому что системная эпоха начинается в полночь (1 января 1970 года, но это не важно для вас).

Если это час или больше, но меньше одного дня, вы можете вывести его в часах: mins: secs format с `

$hoursminsandsecs = date('H:i:s',$numberofsecs);

Более чем на один день вам понадобится использовать модуль для вычисления количества дней, так как это станет актуальной датой начала эпохи.

Надеюсь, что это поможет.

Ответ 4

Возможно, самый простой способ:

gmdate('H:i:s', $your_time_in_seconds);

Ответ 5

Пусть $time будет временем в виде количества секунд.

$seconds = $time % 60;
$time = ($time - $seconds) / 60;
$minutes = $time % 60;
$hours = ($time - $minutes) / 60;

Теперь часы, минуты и секунды находятся в $hours, $minutes и $seconds соответственно.

Ответ 6

Другое решение, которое даст вам дни, часы, минуты и секунды для значения прошедших секунд:

function seconds_to_time($secs)
{
    $dt = new DateTime('@' . $secs, new DateTimeZone('UTC'));
    return array('days'    => $dt->format('z'),
                 'hours'   => $dt->format('G'),
                 'minutes' => $dt->format('i'),
                 'seconds' => $dt->format('s'));
}

print_r(seconds_to_time($seconds_value);

Дополнительная логика понадобится для "дней", если ожидается, что время будет более одного года. Используйте str_pad() или ltrim() для добавления/удаления ведущие нули.

Ответ 7

Ответ ITroubs не затрагивает оставшиеся секунды, когда вы хотите использовать этот код для преобразования количества секунд в формат времени, например часы: минуты: секунды

Вот что я сделал, чтобы справиться с этим: (Это также добавляет начало от нуля до одной цифры минут и секунд)

$seconds = 3921; //example

$hours = floor($seconds / 3600);
$mins = floor(($seconds - $hours*3600) / 60);
$s = $seconds - ($hours*3600 + $mins*60);

$mins = ($mins<10?"0".$mins:"".$mins);
$s = ($s<10?"0".$s:"".$s); 

$time = ($hours>0?$hours.":":"").$mins.":".$s;

$time будет содержать "1:05:21" в этом примере.

Ответ 8

Если вы должны были жестко запрограммировать его, вы должны использовать модуль для извлечения времени, как предложили другие.

Если вы возвращаете секунды из базы данных MySQL, считая, что вам не нужны данные в формате секунд в вашем приложении, есть более чистый способ сделать это, вы можете использовать MySQL SEC_TO_TIME, и он вернет время в формате hh: mm: ss.

Eg.

SELECT SEC_TO_TIME(my_seconds_field) AS my_timestring;

Ответ 9

что-то вроде этого?

 if(is_numeric($time)){
$value = array(
  "years" => 0, "days" => 0, "hours" => 0,
  "minutes" => 0, "seconds" => 0,
);
if($time >= 31556926){
  $value["years"] = floor($time/31556926);
  $time = ($time%31556926);
}
if($time >= 86400){
  $value["days"] = floor($time/86400);
  $time = ($time%86400);
}
if($time >= 3600){
  $value["hours"] = floor($time/3600);
  $time = ($time%3600);
}
if($time >= 60){
  $value["minutes"] = floor($time/60);
  $time = ($time%60);
}
$value["seconds"] = floor($time);
return (array) $value;

} еще {   return (bool) FALSE; }

схвачен от: http://www.ckorp.net/sec2time.php

Ответ 10

Извините, что это слишком поздно, но, возможно, полезно

function mediaTimeDeFormater($seconds)
{
    if (!is_numeric($seconds))
        throw new Exception("Invalid Parameter Type!");


    $ret = "";

    $hours = (string )floor($seconds / 3600);
    $secs = (string )$seconds % 60;
    $mins = (string )floor(($seconds - ($hours * 3600)) / 60);

    if (strlen($hours) == 1)
        $hours = "0" . $hours;
    if (strlen($secs) == 1)
        $secs = "0" . $secs;
    if (strlen($mins) == 1)
        $mins = "0" . $mins;

    if ($hours == 0)
        $ret = "$mins:$secs";
    else
        $ret = "$hours:$mins:$secs";

    return $ret;
}

echo mediaTimeDeFormater(216.064000);//3:36

Ответ 11

Использовать по модулю:

$hours = $time_in_seconds / 3600;
$minutes = ($time_in_seconds / 60) % 60;

Ответ 12

только один небольшой дополнительный пример

запрошено время в милисекундах

    // ms2time( (microtime(true) - ( time() - rand(0,1000000) ) ) );
    // return array
    function ms2time($ms){
        $return = array();
        // ms
        $return['ms'] = (int) number_format( ($ms - (int) $ms), 2, '', '');
        $seconds = (int) $ms;
        unset($ms);

        if ($seconds%60 > 0){
            $return['s'] = $seconds%60;
        } else {
            $return['s'] = 0;
        }

        if ( ($minutes = intval($seconds/60))){
            $return['m'] = $minutes;
        }

        if (isset($return['m'])){
            $return['h'] = intval($return['m'] / 60);
            $return['m']  = $return['m'] % 60; 
        }


        if (isset($return['h'])){
            $return['d'] = intval($return['h'] / 24);
            $return['h']  = $return['h'] % 24; 
        }

        if (isset($return['d']))
            $return['mo'] = intval($return['d'] / 30);

        foreach($return as $k=>$v){
            if ($v == 0)
                unset($return[$k]);
        }

        return $return;
    }

    // ms2time2string( (microtime(true) - ( time() - rand(0,1000000) ) ) );
    // return array     
    function ms2time2string($ms){
        $array = array(
            'ms' => 'ms',
            's'  => 'seconds',
            'm'  => 'minutes',
            'h'  => 'hours',
            'd'  => 'days',
            'mo' => 'month',
        );


        if ( ( $return = ms2time($ms) )  && count($ms) > 0){

            foreach($return as $key=>$data){
                $return[$key] = $data .' '.$array[$key];
            }

        }
        return implode(" ", array_reverse($return));
    }

Ответ 13

Вот еще один способ: "0" для всех из них.

$secCount = 10000;
$hours = str_pad(floor($secCount / (60*60)), 2, '0', STR_PAD_LEFT);
$minutes = str_pad(floor(($secCount - $hours*60*60)/60), 2, '0', STR_PAD_LEFT);
$seconds = str_pad(floor($secCount - ($hours*60*60 + $minutes*60)), 2, '0', STR_PAD_LEFT);

Это адаптация от ответа Flaxious.

Ответ 14

Если вам нужен хороший формат, например: 0:00:00, используйте str_pad() как @Gardner.

Ответ 15

1 день = 86400000 миллисекунд.

DecodeTime (миллисекунды/86400000, ч, мин, сек, мс)

Ups! Я думал в delphi, должно быть что-то похожее на всех языках.