我需要将秒转换为“时:分:秒”格式。
例如:“685” 转换为 “00:11:25”
我该如何实现?
一小时有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等可能存在错误)
printf("%02d:%02d:%02d", $hours, $minutes, $seconds);
- Ambersprintf
来返回值而不是打印它。 - Allen Butler给你
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);
- Ajax如果秒数小于 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
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()
MySQL 示例 结果的范围受到 TIME 数据类型限制,该范围为从 -838:59:59
到 838: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
其他解决方案使用 gmdate
,但在超过86400秒的极端情况下会失败。为了避免这种情况,我们可以自己计算小时数,然后让gmdate
将剩余的秒数转换为分钟/秒。
echo floor($seconds / 3600) . gmdate(":i:s", $seconds % 3600);
输入:6030
输出:1:40:30
输入:2000006030
输出:555557:13:50
// 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
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
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
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
。我已经在这里解释过这个问题,以下是该答案:
在 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);
将是使用的最佳选项...
datetime
...所以如果我们期望结果> 24小时,它将无法工作。此外,如果我们需要一些负面的结果(例如使用偏移量),它也无法工作。关于缺乏细节的问题给出了“-1”。 - WonderLandecho gmdate("z H:i:s", 685);
。其中,z表示一年中从0开始计数的天数。您可以查看PHP日期手册以满足特定需求。 - Nightwolf