将秒转换为时:分:秒

394

我需要将秒转换为“时:分:秒”格式。

例如:“685” 转换为 “00:11:25”

我该如何实现?

30个回答

853
你可以使用gmdate()函数:
echo gmdate("H:i:s", 685);

195
最好确保秒数不超过86,400。 - salathe
16
H代表一天中的小时数。因此,如果你有90000秒,并对其使用H,结果将为01(下一天的第一个小时)。不是25——一天只有24个小时。 - MarcinWolny
7
我不确定这是否是正确答案,它会产生一个datetime...所以如果我们期望结果> 24小时,它将无法工作。此外,如果我们需要一些负面的结果(例如使用偏移量),它也无法工作。关于缺乏细节的问题给出了“-1”。 - WonderLand
66
由于明显的缺陷,对于超过24小时的时间,这不应该成为被接受的答案。 - Scott Flack
10
对于可能超过85399的天数,您可以使用 echo gmdate("z H:i:s", 685);。其中,z表示一年中从0开始计数的天数。您可以查看PHP日期手册以满足特定需求。 - Nightwolf
显示剩余12条评论

202

一小时有3600秒,一分钟有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

(我没有进行太多测试,所以floor等可能存在错误)


但他想要两个零... "00:11:25" 而不是 "0:11:25" - animuson
65
printf("%02d:%02d:%02d", $hours, $minutes, $seconds); - Amber
10
回答不错,但是请确保在每个操作之间从$init中减去$hours * 3600和$minutes * 60,否则会重复计算分钟和秒数。 - Mike Stowe
9
补充@Amber的评论,使用sprintf来返回值而不是打印它。 - Allen Butler
这个对我来说最好用。还有一点要补充,当你的时间少于10小时时,它会显示3:10:59。让它看起来像OP想要的03:10:59。代码如下:$hours = floor( 2300 / 3600); return ($hours < 10 ? '0' . $hours : $hours) . gmdate(":i:s", $this->getSeconds() % 3600); - NME New Media Entertainment

93

给你

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

74

如果秒数小于 86400 秒(1天),请仅使用函数 gmdate()

$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()clonesprintf()

运行示例


MySQL 示例 结果的范围受到 TIME 数据类型限制,该范围为从 -838:59:59838:59:59

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

参见:SEC_TO_TIME

运行演示


PostgreSQL 示例:

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

运行演示


45

其他解决方案使用 gmdate,但在超过86400秒的极端情况下会失败。为了避免这种情况,我们可以自己计算小时数,然后让gmdate将剩余的秒数转换为分钟/秒。

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

输入:6030 输出:1:40:30

输入:2000006030 输出:555557:13:50


17
// 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); 这并不足以获取天-小时-分钟-秒。 - mughal

9
如果您不喜欢被接受的答案或流行的答案,那么尝试这个。
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

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

如果no_of_seconds大于一天(一天的秒数),则不会以H:i:s格式给出时间。 它将忽略天数并仅给出小时:分:秒
例如:
gmdate("H:i:s", 89922); // returns 0:58:42 not (1 Day 0:58:42) or 24:58:42

7
这里有一个一行代码,可以处理负数秒和超过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

我已经在这里解释过这个问题,以下是该答案:

23:59:59 时间之前,您可以使用 PHP 默认函数。

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

该函数仅返回结果到23:59:59

若您的秒数大于86399,则可以借助@VolkerK的答案实现。

$time = round($seconds);
echo sprintf('%02d:%02d:%02d', ($time/3600),($time/60%60), $time%60);

将是使用的最佳选项...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接