초를 시간 : 분 : 초로 변환


330

초를 "Hour : Minute : Second"로 변환해야합니다.

예 : "685"를 "00:11:25"로 변환

어떻게하면 되나요?


4
질문이 모호 : 당신이 당신을 변환 할 secondsA를 date/time분 : 초 또는 시간의 양에?
WonderLand

답변:


741

gmdate()기능을 사용할 수 있습니다 :

echo gmdate("H:i:s", 685);

166
그러나 초 수가 86,400 미만인지 확인하는 것이 좋습니다.
salathe

12
H는 하루의 시간을 나타냅니다. 따라서 90000 초가 있고 H를 사용하면 결과는 01 (다음날의 첫 시간)이됩니다. 25 아님-하루에 24 시간 밖에 없습니다.
MarcinWolny

7
이것이 정답인지 잘 모르겠습니다. 이것은 datetime... 을 생성 하므로 결과가 24 시간을 초과하면 작동하지 않습니다. 또한 부정적인 결과가 필요한 경우 (예 : offset 작업) 작동하지 않습니다. -1자세한 내용은
WonderLand

54
24 시간을 초과하는 시간에 명백한 결함으로 인해 허용되는 답변이되어서는 안됩니다.
Scott Flack

10
숫자가 85399보다 클 수있는 날과 함께 사용하려면 echo gmdate("z H:i:s", 685);z는 0으로 시작하는 연도의 일 수를 사용할 수 있습니다. php 날짜 매뉴얼을 분명히 검토하여 특정 요구를 충족시킬 수 있습니다.
Nightwolf

177

1 시간은 3600 초, 1 분은 60 초입니다.

<?php

$init = 685;
$hours = floor($init / 3600);
$minutes = floor(($init / 60) % 60);
$seconds = $init % 60;

echo "$hours:$minutes:$seconds";

?>

어떤 생산 :

$ php file.php
0:11:25

(나는 이것을 많이 테스트하지 않았으므로 바닥에 오류가있을 수 있습니다)


그러나 그는 두 개의 0을 원합니다 ... "00:11:25" "0:11:25"
animuson

52
printf("%02d:%02d:%02d", $hours, $minutes, $seconds);
Amber

5
좋은 대답이지만 각 작업 사이에서 $ init에서 $ hours * 3600 및 $ minutes * 60을 빼야합니다. 그렇지 않으면 두 번 세는 분과 초가됩니다.
Mike Stowe

5
@Amber의 설명에 추가하려면을 사용 sprintf하여 값을 인쇄하지 말고 반환하십시오.
Allen Butler

77

여기있어

function format_time($t,$f=':') // t = seconds, f = separator 
{
  return sprintf("%02d%s%02d%s%02d", floor($t/3600), $f, ($t/60)%60, $f, $t%60);
}

echo format_time(685); // 00:11:25

1
음수 값에는 작동하지 않습니다. 음의 초 간격이있는 경우 다음을 사용하십시오.return ($t< 0 ? '-' : '') . sprintf("%02d%s%02d%s%02d", floor(abs($t)/3600), $f, (abs($t)/60)%60, $f, abs($t)%60); }
Ajax

66

gmdate() 초가 86400(1 일) 미만인 경우에만 기능을 사용하십시오 .

$seconds = 8525;
echo gmdate('H:i:s', $seconds);
# 02:22:05

참조 : gmdate ()

데모 실행


'발'에 의해 형식으로 초 변환 제한 없음 * :

$seconds = 8525;
$H = floor($seconds / 3600);
$i = ($seconds / 60) % 60;
$s = $seconds % 60;
echo sprintf("%02d:%02d:%02d", $H, $i, $s);
# 02:22:05

참조 : floor () , sprintf () , 산술 연산자

데모 실행


DateTime확장 사용 예 :

$seconds = 8525;
$zero    = new DateTime("@0");
$offset  = new DateTime("@$seconds");
$diff    = $zero->diff($offset);
echo sprintf("%02d:%02d:%02d", $diff->days * 24 + $diff->h, $diff->i, $diff->s);
# 02:22:05

참조 : DateTime :: __ construct () , DateTime :: modify () , clone , sprintf ()

데모 실행


결과의-838:59:59838:59:59 MySQL 예제 범위는 다음과 같은 TIME 데이터 유형의 범위로 제한 됩니다 .

SELECT SEC_TO_TIME(8525);
# 02:22:05

SEC_TO_TIME 참조

데모 실행


PostgreSQL 예제 :

SELECT TO_CHAR('8525 second'::interval, 'HH24:MI:SS');
# 02:22:05

데모 실행


30

다른 솔루션은을 사용 gmdate하지만 86400 초 이상인 경우에는 실패합니다. 이 문제를 해결하려면 시간을 직접 gmdate계산 한 다음 남은 초를 분 / 초로 계산하면됩니다.

echo floor($seconds / 3600) . gmdate(":i:s", $seconds % 3600);

입력 : 6030 출력 :1:40:30

입력 : 2000006030 출력 :555557:13:50


16
// TEST
// 1 Day 6 Hours 50 Minutes 31 Seconds ~ 111031 seconds

$time = 111031; // time duration in seconds

$days = floor($time / (60 * 60 * 24));
$time -= $days * (60 * 60 * 24);

$hours = floor($time / (60 * 60));
$time -= $hours * (60 * 60);

$minutes = floor($time / 60);
$time -= $minutes * 60;

$seconds = floor($time);
$time -= $seconds;

echo "{$days}d {$hours}h {$minutes}m {$seconds}s"; // 1d 6h 50m 31s

$ hms = gmdate ( "H : i : s", 12720); 14 분
mughal

7
gmdate("H:i:s", no_of_seconds);

1 일 (하루 초)보다 큰 H:i:s경우 시간 형식을 제공하지 않습니다 no_of_seconds.
그것은 하루 가치를 무시하고 단지 줄 것이다Hour:Min:Seconds

예를 들면 다음과 같습니다.

gmdate("H:i:s", 89922); // returns 0:58:42 not (1 Day 0:58:42) or 24:58:42

6

다음은 음의 초와 1 일 이상의 초를 처리하는 하나의 라이너입니다.

sprintf("%s:%'02s:%'02s\n", intval($seconds/60/60), abs(intval(($seconds%3600) / 60)), abs($seconds%60));

예를 들어 :

$seconds= -24*60*60 - 2*60*60 - 3*60 - 4; // minus 1 day 2 hours 3 minutes 4 seconds
echo sprintf("%s:%'02s:%'02s\n", intval($seconds/60/60), abs(intval(($seconds%3600) / 60)), abs($seconds%60));

출력 : -26 : 03 : 04


음수이고 1 시간 미만인 경우 작동하지 않습니다. -3000 = 0:50:00은 -0 : 50 : 00이어야합니다.
Tony Brix

6

수락 된 답변이나 인기있는 답변이 마음에 들지 않으면이 방법을 사용해보십시오.

function secondsToTime($seconds_time)
{
    if ($seconds_time < 24 * 60 * 60) {
        return gmdate('H:i:s', $seconds_time);
    } else {
        $hours = floor($seconds_time / 3600);
        $minutes = floor(($seconds_time - $hours * 3600) / 60);
        $seconds = floor($seconds_time - ($hours * 3600) - ($minutes * 60));
        return "$hours:$minutes:$seconds";
    }
}

secondsToTime(108620); // 30:10:20

5

이와 같은 함수를 작성하여 배열을 반환

function secondsToTime($seconds) {

  // extract hours
  $hours = floor($seconds / (60 * 60));

  // extract minutes
  $divisor_for_minutes = $seconds % (60 * 60);
  $minutes = floor($divisor_for_minutes / 60);

  // extract the remaining seconds
  $divisor_for_seconds = $divisor_for_minutes % 60;
  $seconds = ceil($divisor_for_seconds);

  // return the final array
  $obj = array(
      "h" => (int) $hours,
      "m" => (int) $minutes,
      "s" => (int) $seconds,
   );

  return $obj;
}

다음과 같이 간단히 함수를 호출하십시오.

secondsToTime(100);

출력은

Array ( [h] => 0 [m] => 1 [s] => 40 )

4

보다:

    /** 
     * Convert number of seconds into hours, minutes and seconds 
     * and return an array containing those values 
     * 
     * @param integer $inputSeconds Number of seconds to parse 
     * @return array 
     */ 

    function secondsToTime($inputSeconds) {

        $secondsInAMinute = 60;
        $secondsInAnHour  = 60 * $secondsInAMinute;
        $secondsInADay    = 24 * $secondsInAnHour;

        // extract days
        $days = floor($inputSeconds / $secondsInADay);

        // extract hours
        $hourSeconds = $inputSeconds % $secondsInADay;
        $hours = floor($hourSeconds / $secondsInAnHour);

        // extract minutes
        $minuteSeconds = $hourSeconds % $secondsInAnHour;
        $minutes = floor($minuteSeconds / $secondsInAMinute);

        // extract the remaining seconds
        $remainingSeconds = $minuteSeconds % $secondsInAMinute;
        $seconds = ceil($remainingSeconds);

        // return the final array
        $obj = array(
            'd' => (int) $days,
            'h' => (int) $hours,
            'm' => (int) $minutes,
            's' => (int) $seconds,
        );
        return $obj;
    }

보낸 사람 : 초를 일, 시간, 분 및 초로 변환


3

이 시도:

date("H:i:s",-57600 + 685);

http://bytes.com/topic/php/answers/3917-seconds-converted-hh-mm-ss 에서
가져옴


완전히 확실하지는 않지만 시간을 0으로 설정하면 그 위에 무엇이 든 정답 일 것입니다.
Kerry Jones

- 당신은 날짜 ()로 조정 할 수없는 분, 앞이 풋 선도 0의 ca.php.net/manual/en/function.date.php
barfoon

@ barfoon-사실이지만, 이것이 M.Ezz가 요구 한 것이라고 생각하며 시간에 사용되는 표준입니다. 이것은 "03:07:05"대신 "3 : 7 : 5"또는 "3 : 7"경험에 비해 이상하게 보입니다.
Kerry Jones

3

프로젝트에서 근무한 시간을 추적하면서 gmtdate () 함수가 작동하지 않았으며 24 시간이 넘으면 24 시간을 뺀 후에 남은 금액을 얻습니다. 즉, 37 시간은 13 시간이됩니다. (Glavic이 위에서 언급 한 것처럼-귀하의 사례에 감사드립니다!) 이것은 잘 작동했습니다.

Convert seconds to format by 'foot' no limit :
$seconds = 8525;
$H = floor($seconds / 3600);
$i = ($seconds / 60) % 60;
$s = $seconds % 60;
echo sprintf("%02d:%02d:%02d", $H, $i, $s);
# 02:22:05

3

이 기능은 유용하며 확장 할 수 있습니다.

function formatSeconds($seconds) {

if(!is_integer($seconds)) {
    return FALSE;
}

$fmt = "";

$days = floor($seconds / 86400);
if($days) {
    $fmt .= $days."D ";
    $seconds %= 86400;
}

$hours = floor($seconds / 3600);
if($hours) {
    $fmt .= str_pad($hours, 2, '0', STR_PAD_LEFT).":";
    $seconds %= 3600;
}

$mins = floor($seconds / 60 );
if($mins) {
    $fmt .= str_pad($mins, 2, '0', STR_PAD_LEFT).":";
    $seconds %= 60;
}

$fmt .= str_pad($seconds, 2, '0', STR_PAD_LEFT);

return $fmt;}

2

솔루션 : https://gist.github.com/SteveJobzniak/c91a8e2426bac5cb9b0cbc1bdbc45e4b

여기는 매우 깨끗하고 짧은 방법입니다!

이 코드는 지루한 함수 호출과 개별 문자열 작성을 피하고 사람들이이를 위해 크고 큰 기능을 수행하지 않도록합니다.

"1h05m00s"형식을 생성하고 0이 아닌 다른 시간 구성 요소가 앞에 오는 한 분과 초에 선행 0을 사용합니다.

그리고 "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"

있습니다 gmdate()해킹는이보다 더 짧은,하지만 24 시간이 기간을 지원합니다. gmdate 트릭을 사용하면 24 시간 이상은 실패합니다!
gw0

1

이를 위해 DateTime을 사용하는 간단한 방법은 다음과 같습니다.

    $time = 60; //sec.
    $now = time();
    $rep = new DateTime('@'.$now);
    $diff = new DateTime('@'.($now+$time));
    $return = $diff->diff($rep)->format($format);

    //output:  01:04:65

DateTime 형식의 형식을 사용할 수있는 간단한 솔루션입니다.


1

자바에서는 이런 식으로 사용할 수 있습니다.

   private String getHmaa(long seconds) {
    String string;
    int hours = (int) seconds / 3600;
    int remainder = (int) seconds - hours * 3600;
    int mins = remainder / 60;
    //remainder = remainder - mins * 60;
    //int secs = remainder;

    if (hours < 12 && hours > 0) {
        if (mins < 10) {
            string = String.valueOf((hours < 10 ? "0" + hours : hours) + ":" + (mins > 0 ? "0" + mins : "0") + " AM");
        } else {
            string = String.valueOf((hours < 10 ? "0" + hours : hours) + ":" + (mins > 0 ? mins : "0") + " AM");
        }
    } else if (hours >= 12) {
        if (mins < 10) {
            string = String.valueOf(((hours - 12) < 10 ? "0" + (hours - 12) : ((hours - 12) == 12 ? "0" : (hours - 12))) + ":" + (mins > 0 ? "0" + mins : "0") + ((hours - 12) == 12 ? " AM" : " PM"));
        } else {
            string = String.valueOf(((hours - 12) < 10 ? "0" + (hours - 12) : ((hours - 12) == 12 ? "0" : (hours - 12))) + ":" + (mins > 0 ? mins : "0") + ((hours - 12) == 12 ? " AM" : " PM"));
        }
    } else {
        if (mins < 10) {
            string = String.valueOf("0" + ":" + (mins > 0 ? "0" + mins : "0") + " AM");
        } else {
            string = String.valueOf("0" + ":" + (mins > 0 ? mins : "0") + " AM");
        }
    }
    return string;
}

0
function timeToSecond($time){
    $time_parts=explode(":",$time);
    $seconds= ($time_parts[0]*86400) + ($time_parts[1]*3600) + ($time_parts[2]*60) + $time_parts[3] ; 
    return $seconds;
}

function secondToTime($time){
    $seconds  = $time % 60;
    $seconds<10 ? "0".$seconds : $seconds;
    if($seconds<10) {
        $seconds="0".$seconds;
    }
    $time     = ($time - $seconds) / 60;
    $minutes  = $time % 60;
    if($minutes<10) {
        $minutes="0".$minutes;
    }
    $time     = ($time - $minutes) / 60;
    $hours    = $time % 24;
    if($hours<10) {
        $hours="0".$hours;
    }
    $days     = ($time - $hours) / 24;
    if($days<10) {
        $days="0".$days;
    }

    $time_arr = array($days,$hours,$minutes,$seconds);
    return implode(":",$time_arr);
}

0

글쎄, 몇 분에서 몇 초로 초를 줄일 수 있지만 24 시간을 초과하고 더 이상 며칠로 줄이지 않는 것이 필요했습니다.

작동하는 간단한 기능은 다음과 같습니다. 아마 그것을 향상시킬 수 있습니다 ...하지만 여기 있습니다 :

function formatSeconds($seconds)
{
    $hours = 0;$minutes = 0;
    while($seconds >= 60){$seconds -= 60;$minutes++;}
    while($minutes >= 60){$minutes -=60;$hours++;}
    $hours = str_pad($hours, 2, '0', STR_PAD_LEFT);
    $minutes = str_pad($minutes, 2, '0', STR_PAD_LEFT);
    $seconds = str_pad($seconds, 2, '0', STR_PAD_LEFT);
    return $hours.":".$minutes.":".$seconds;
}

0
$given = 685;

 /*
 * In case $given == 86400, gmdate( "H" ) will convert it into '00' i.e. midnight.
 * We would need to take this into consideration, and so we will first
 * check the ratio of the seconds i.e. $given:$number_of_sec_in_a_day
 * and then after multiplying it by the number of hours in a day (24), we
 * will just use "floor" to get the number of hours as the rest would
 * be the minutes and seconds anyways.
 *
 * We can also have minutes and seconds combined in one variable,
 * e.g. $min_sec = gmdate( "i:s", $given );
 * But for versatility sake, I have taken them separately.
 */

$hours = ( $given > 86399 ) ? '0'.floor( ( $given / 86400 ) * 24 )-gmdate( "H", $given ) : gmdate("H", $given );

$min = gmdate( "i", $given );

$sec = gmdate( "s", $given );

echo $formatted_string = $hours.':'.$min.':'.$sec;

함수로 변환하려면 :

function getHoursFormat( $given ){

 $hours = ( $given > 86399 ) ? '0'.floor( ( $given / 86400 ) * 24 )-gmdate( "H", $given ) : gmdate("H", $given );

 $min = gmdate( "i", $given );

 $sec = gmdate( "s", $given );

 $formatted_string = $hours.':'.$min.':'.$sec;

 return $formatted_string;

}

0

자바 스크립트 에서이 작업을 수행 해야하는 경우 여기에 답변 된대로 한 줄의 코드로 수행 할 수 있습니다 .JavaScript로 초를 HH-MM-SS로 변환 하십시오 . SECONDS 를 변환하려는 것으로 바꿉니다 .

var time = new Date(SECONDS * 1000).toISOString().substr(11, 8);

0

YouTube 등과 같은 오디오 / 비디오 길이 문자열을 만들려면 다음을 수행하십시오.

($seconds >= 60) ? ltrim(gmdate("H:i:s", $seconds), ":0") : gmdate("0:s", $seconds)

다음과 같은 문자열을 반환합니다 :

55.55 => '0:55'
100   => '1:40'

24 시간을 초과하는 시간에는 제대로 작동하지 않을 수 있습니다.


0

이것은 그렇게하는 예쁜 방법입니다.

function time_converter($sec_time, $format='h:m:s'){
      $hour = intval($sec_time / 3600) >= 10 ? intval($sec_time / 3600) : '0'.intval($sec_time / 3600);
      $minute = intval(($sec_time % 3600) / 60) >= 10 ? intval(($sec_time % 3600) / 60) : '0'.intval(($sec_time % 3600) / 60);
      $sec = intval(($sec_time % 3600) % 60)  >= 10 ? intval(($sec_time % 3600) % 60) : '0'.intval(($sec_time % 3600) % 60);

      $format = str_replace('h', $hour, $format);
      $format = str_replace('m', $minute, $format);
      $format = str_replace('s', $sec, $format);

      return $format;
    }

-1

다른 사람 이이 멋진 형식을 반환하는 간단한 함수를 찾고있는 경우 (OP가 요청한 형식이 아니라는 것을 알고 있습니다), 이것이 내가 생각해 낸 것입니다. 이 코드를 기반으로 한 @mughal에게 감사드립니다.

function format_timer_result($time_in_seconds){
    $time_in_seconds = ceil($time_in_seconds);

    // Check for 0
    if ($time_in_seconds == 0){
        return 'Less than a second';
    }

    // Days
    $days = floor($time_in_seconds / (60 * 60 * 24));
    $time_in_seconds -= $days * (60 * 60 * 24);

    // Hours
    $hours = floor($time_in_seconds / (60 * 60));
    $time_in_seconds -= $hours * (60 * 60);

    // Minutes
    $minutes = floor($time_in_seconds / 60);
    $time_in_seconds -= $minutes * 60;

    // Seconds
    $seconds = floor($time_in_seconds);

    // Format for return
    $return = '';
    if ($days > 0){
        $return .= $days . ' day' . ($days == 1 ? '' : 's'). ' ';
    }
    if ($hours > 0){
        $return .= $hours . ' hour' . ($hours == 1 ? '' : 's') . ' ';
    }
    if ($minutes > 0){
        $return .= $minutes . ' minute' . ($minutes == 1 ? '' : 's') . ' ';
    }
    if ($seconds > 0){
        $return .= $seconds . ' second' . ($seconds == 1 ? '' : 's') . ' ';
    }
    $return = trim($return);

    return $return;
}

-1

미래에 이것을 찾는 사람은 초기 포스터가 요구 한 형식을 제공합니다.

$init = 685;
$hours = floor($init / 3600);
$hrlength=strlen($hours);
if ($hrlength==1) {$hrs="0".$hours;}
else {$hrs=$hours;} 

$minutes = floor(($init / 60) % 60);
$minlength=strlen($minutes);
if ($minlength==1) {$mins="0".$minutes;}
else {$mins=$minutes;} 

$seconds = $init % 60;
$seclength=strlen($seconds);
if ($seclength==1) {$secs="0".$seconds;}
else {$secs=$seconds;} 

echo "$hrs:$mins:$secs";

-3
<?php
$time=3*3600 + 30*60;


$year=floor($time/(365*24*60*60));
$time-=$year*(365*24*60*60);

$month=floor($time/(30*24*60*60));
$time-=$month*(30*24*60*60);

$day=floor($time/(24*60*60));
$time-=$day*(24*60*60);

$hour=floor($time/(60*60));
$time-=$hour*(60*60);

$minute=floor($time/(60));
$time-=$minute*(60);

$second=floor($time);
$time-=$second;
if($year>0){
    echo $year." year, ";
}
if($month>0){
    echo $month." month, ";
}
if($day>0){
    echo $day." day, ";
}
if($hour>0){
    echo $hour." hour, ";
}
if($minute>0){
    echo $minute." minute, ";
}
if($second>0){
    echo $second." second, ";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.