我需要将秒转换为“小时:分钟:秒”。例如,“ 685”转换为“ 00:11:25”

我该如何实现? ?

评论

问题不明确:您要将秒数转换为日期/时间或小时数:分钟数:秒?

#1 楼

您可以使用gmdate()函数:

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


评论


最好确保秒数低于86,400。

–萨拉特
2010年7月3日,19:15

H代表一天中的小时数。因此,如果您有90000秒,并且将在其上使用H,则结果将为01(第二天的第一个小时)。不是25-一天只有24小时。

– MarcinWolny
13年6月20日在10:35

我不确定这是否是正确的答案,这会产生日期时间...因此,如果我们期望结果> 24小时,它将无法正常工作。同样,如果我们需要一些否定的结果(例如,使用offset),它将不起作用。 -1为百灵鸟

– Wonderland
2014年7月1日在11:38

由于存在超过24小时的明显缺陷,因此不应接受此答案。

– Scott Flack
2014年9月3日下午5:23

对于数字可能大于85399的日子,可以使用echo gmdate(“ z H:i:s”,685); z是一年中从0开始的天数。您可以明显地查看php date手册,以满足您的特定需求。

–夜狼
16年8月11日在6:51

#2 楼

一小时是3600秒,一分钟是60秒,为什么不呢?

<?php

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

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

?>


产生: (我没有做太多测试,所以地板可能有错误)

评论


但是他想要两个零...“ 00:11:25”而不是“ 0:11:25”

– animuson♦
2010年7月3日在18:23

printf(“%02d:%02d:%02d”,$小时,$分钟,$秒);

–琥珀色
2010年7月3日,18:26

好的答案,但是请确保在每次操作之间从$ init中减去$ hours * 3600和$ minutes * 60,否则最终将导致数分钟和数秒的重复计算。

–麦克·斯托(Mike Stowe)
15年7月25日在5:07

要添加到@Amber的注释中,请使用sprintf返回值,而不是打印它。

–艾伦·巴特勒
16-09-19在18:33

#3 楼

你去哪里

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


评论


对于负值无效。如果秒间隔为负,请使用以下方法:return($ t <0?'-':'')。 sprintf(“%02d%s%02d%s%02d”,floor(abs($ t)/ 3600),$ f,(abs($ t)/ 60)%60,$ f,abs($ t)% 60); }

–阿贾克斯
13年11月15日在10:25

#4 楼

仅当秒数少于gmdate()(1天)时才使用函数86400

 $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(),克隆,

运行演示


MySQL示例范围结果被限制为TIME数据类型,即-838:59:59838:59:59

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


请参阅:SEC_TO_TIME

运行演示



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


运行演示

#5 楼

其他解决方案使用gmdate,但是在超过86400秒的极端情况下失败。为了解决这个问题,我们可以自己简单地计算小时数,然后让gmdate将剩余秒数转换为分钟/秒。 >输出:6030

输入:1:40:30
输出:2000006030

#6 楼

 // 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);不足以获取Day-Hour-Min-Sec

–莫卧儿
2013年8月3日14:56

#7 楼

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


如果H:i:s大于1天(一天中的秒数),则不会以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


#8 楼

如果您不喜欢接受的答案或受欢迎的答案,请尝试以下答案

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


#9 楼

这是一个处理负秒数和超过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)
2015年5月15日15:52

#10 楼

像这样编写函数以返回数组

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);


#11 楼

请参阅:

    /** 
     * 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;
    }


来自:将秒转换为天,小时,分钟和秒

#12 楼

尝试以下操作:

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


摘自http://bytes.com/topic/php/answers/3917-seconds-converted-hh-mm-ss

评论


不太确定,但是我很确定将时间设置为0,然后在此之上的任何内容都将是正确的答案

–凯里·琼斯(Kerry Jones)
2012年2月3日,0:35

这会将分钟前面的0放在前面,您无法使用date()进行调整-ca.php.net/manual/en/function.date.php

– barfoon
2012年6月24日在3:41

@barfoon-是的,但是我相信这是M.Ezz所要求的,并且是及时使用的标准。从我的经验来看,这看起来很奇怪,而不是“ 03:07:05”,甚至是“ 3:7”,而不是“ 03:07:05”,对我来说更像是一个比率。

–凯里·琼斯(Kerry Jones)
2012年6月25日17:08

#13 楼

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


#14 楼

这个功能很有用,您可以扩展它:

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;}


#15 楼

来自以下网址的解决方案: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()调用中,如下所示:

在以上两个代码段中必须为0或更高。不支持负持续时间。但是您可以使用以下替代代码来处理负数的持续时间:

$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'; }


评论


请注意,gmdate()hack比这更短,但仅支持持续24小时。如果您使用gmdate技巧,则24小时以上的任何操作都将失败!

– gw0
17年2月5日在18:25

#16 楼

使用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格式的方法。

#17 楼

在Java中,您可以使用这种方式。

   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;
}


#18 楼

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);
}


#19 楼

好吧,我需要一些可以将秒数减少到数分钟和数秒,但要超过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;
}


#20 楼

$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;

}


#21 楼

如果您需要使用javascript进行操作,则可以按照此处回答的仅一行代码来完成。用要转换的内容替换SECONDS。

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


#22 楼

如果要创建YouTube等音频/视频持续时间字符串,可以执行以下操作:

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

将返回字符串,例如:
55.55 => '0:55'
100   => '1:40'


时间> = 24小时可能无法正常工作。

#23 楼

这是一个很好的方法:

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;
    }


#24 楼

以下代码可以准确显示总时数加上分钟和秒数
$duration_in_seconds = 86401;
if($duration_in_seconds>0)
{
    echo floor($duration_in_seconds/3600).gmdate(":i:s", $duration_in_seconds%3600);
}
else
{
    echo "00:00:00";
}


评论


不鼓励在SO上使用仅代码答案。阶段添加长期价值的解释。未来的访问者应该能够从您的回答中学习,并将其知识提供给自己的问题。它们也被认为质量更好(对平台有利),并且更有可能被否决。请考虑进行编辑以添加上下文或突出显示重要的位。请在以后的答案中考虑这一点。最后,有些问题不符合SO准则,也不应该回答。重复的问题应改为通过评论或通过引用已问到的问题来关闭

– SherylHohman
20年7月26日在5:58

#25 楼

万一其他人正在寻找一个简单的函数来返回这种格式正确的格式(我知道这不是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;
}


#26 楼

任何将来希望使用此格式的人,都将获得最初要求的格式。

$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";


#27 楼

<?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, ";
}