将秒转换为小时:分钟:秒

M.E*_*M.E 313 php time

我需要将秒转换为"小时:分钟:秒".

例如:"685"转换为"00:11:25"

我怎样才能做到这一点?

ani*_*son 704

你可以使用这个gmdate()功能:

echo gmdate("H:i:s", 685);
Run Code Online (Sandbox Code Playgroud)

  • 最好确保秒数低于86,400. (160认同)
  • 由于超过24小时的明显缺陷,这不应该是公认的答案. (52认同)
  • H表示一天中的小时数.因此,如果您有90000秒并且您将使用H,则结果将为01(第二天的第一个小时).不是25 - 一天只有24小时. (11认同)
  • 对于数字可能大于85399的日子,你可以使用`echo gmdate("z H:i:s",685);`z是从0开始的一年中的天数.显然你可以查看php日期手册,以满足您的特定需求. (9认同)
  • 我不确定这是正确的答案,这将产生一个'datetime` ...所以如果我们期望结果> 24小时它将无法正常工作.此外,如果我们需要一些负面结果(例如使用偏移),它将无法工作.`-1`为细节的百灵 (7认同)
  • 对不起..这个答案dosnt工作超过一天.. @aif回答工作.. (2认同)

Aif*_*Aif 165

一小时是3600秒,一分钟是60秒所以为什么不:

<?php

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

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

?>
Run Code Online (Sandbox Code Playgroud)

产生:

$ php file.php
0:11:25
Run Code Online (Sandbox Code Playgroud)

(我没有测试过这么多,所以可能会有地板错误等)

  • `printf("%02d:%02d:%02d",$小时,$分钟,$秒);` (50认同)
  • 很好的答案,但要确保你在每次操作之间从$ init减去$ hours*3600和$ minutes*60否则你将最终重复计算分钟和秒. (5认同)
  • 要添加@Amber的注释,请使用`sprintf`返回值而不是打印它. (4认同)

nat*_*han 72

干得好

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
Run Code Online (Sandbox Code Playgroud)


Gla*_*vić 64

gmdate() 仅在秒小于86400(1天)时使用功能:

$seconds = 8525;
echo gmdate('H:i:s', $seconds);
# 02:22:05
Run Code Online (Sandbox Code Playgroud)

请参阅: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
Run Code Online (Sandbox Code Playgroud)

请参阅: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
Run Code Online (Sandbox Code Playgroud)

请参阅:DateTime :: __ construct(),DateTime :: modify(),clone, sprintf()

运行演示


MySQL的例子的结果的范围被限制为时间数据类型,它是从-838:59:59838:59:59:

SELECT SEC_TO_TIME(8525);
# 02:22:05
Run Code Online (Sandbox Code Playgroud)

请参阅:SEC_TO_TIME

运行演示


PostgreSQL示例:

SELECT TO_CHAR('8525 second'::interval, 'HH24:MI:SS');
# 02:22:05
Run Code Online (Sandbox Code Playgroud)

运行演示


小智 30

其他解决方案使用gmdate,但在有超过86400秒的边缘情况下失败.为了解决这个问题,我们可以简单地计算自己的小时数,然后gmdate将剩余的秒数计算为分钟/秒.

echo floor($seconds / 3600) . gmdate(":i:s", $seconds % 3600);
Run Code Online (Sandbox Code Playgroud)

输入: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
Run Code Online (Sandbox Code Playgroud)


小智 7

gmdate("H:i:s", no_of_seconds);
Run Code Online (Sandbox Code Playgroud)

H:i:s如果no_of_seconds大于1天(一天中的秒数),则不会给出时间格式.
它会忽略日价值而只给予Hour:Min:Seconds

例如:

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


Era*_*nda 7

如果你不喜欢接受的答案或受欢迎的答案,那么试试这个

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
Run Code Online (Sandbox Code Playgroud)


小智 6

这是一个处理负秒和超过1天秒的衬里.

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

例如:

$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));
Run Code Online (Sandbox Code Playgroud)

输出:-26:03:04


Man*_*wat 6

我已经在这里解释过这一点 ,也将答案粘贴在这里

在这几个小时内,23:59:59您可以使用 PHP 默认函数

echo gmdate("H:i:s", 86399);
Run Code Online (Sandbox Code Playgroud)

这只会返回结果直到23:59:59

如果您的秒数超过 86399,则在 @VolkerK 答案的帮助下

$time = round($seconds);
echo sprintf('%02d:%02d:%02d', ($time/3600),($time/60%60), $time%60);
Run Code Online (Sandbox Code Playgroud)

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


vam*_*nem 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;
}
Run Code Online (Sandbox Code Playgroud)

然后简单地调用这个函数:

secondsToTime(100);
Run Code Online (Sandbox Code Playgroud)

输出是

Array ( [h] => 0 [m] => 1 [s] => 40 )
Run Code Online (Sandbox Code Playgroud)