如何将秒转换为时间格式?

72

由于某些原因,我将时间格式转换为:03:30至秒3 * 3600 + 30 * 60,现在。我想将其转换回上述的第一个(相同)格式。怎么做呢?

我的尝试:

3*3600 + 30*60 = 12600 

12600 / 60 = 210 / 60 = 3.5, floor(3.5) = 3 = hour

现在,分钟怎么办?

考虑到值可能是像 19:00或02:51 这样的形式,我想你已经明白了。

顺便问一下,如何使用正则表达式将 2:0 转换为 02:00

15个回答

185

这可能更简单

gmdate("H:i:s", $seconds)

PHP gmdate


31
这只能持续24小时,然后重置为00:00:00。 - gadelat
11
请让它包裹起来:gmdate("H:i:s", $seconds%86400)。 (注:该代码是将给定秒数转换为“小时:分钟:秒”的格式,其中“%86400”是用于将秒数限制在一天内的操作。) - Synchro
@Synchro,仍然没有起作用。 - Nadeem0035
1
我喜欢这个简单易懂的方法,可以从秒数计算视频时间! - Jeff Thomas
这是我在如果小时数为0时截断前导零的方法: preg_replace('/^00:/', '', gmdate("H:i:s", $seconds)) - maosmurf
这个回答真的需要更多的踩,因为它是错误的,并且会产生像评论中提到的那样的错误。 - user151496

153
$hours = floor($seconds / 3600);
$mins = floor($seconds / 60 % 60);
$secs = floor($seconds % 60);

如果你想获得时间格式:

$timeFormat = sprintf('%02d:%02d:%02d', $hours, $mins, $secs);

12
而对于剩余的秒数: $secs = floor(($seconds - ($hours*3600) - ($mins*60))); - Attila Fulop
floor 表示向下取整。@Dewan159 - Cullub
2
$days = floor($seconds / 86400); $hours = floor($seconds % 86400 / 3600);对于包含天数的版本 - Jacek Słoma
你可以使用 (int) ($seconds % 60) 替代 floor() 函数。将数值转换为整型只会移除小数部分,因此 -1.1 将变成 -1。如果使用 floor(),则 -1.1 将变成 -2。 - William Randokun
注意:如果使用了%02d,则不需要使用floor - Guilherme Nascimento
我在 floor 函数内添加了 abs($seconds),在使用 $sign = $seconds <0? '-' : ''; 之前检查符号,并将其添加到时间之前。 否则,在有负秒数/时间时,结果不正确。 - Dominik Mayrhofer

19

如果你知道的时间少于一小时,你可以直接使用date()$date->format()函数。

$minsandsecs = date('i:s',$numberofsecs);

这个工作的原因是系统纪元时间从午夜开始(1970年1月1日,但这对你不重要)。

如果时间在1小时以上但少于1天,则可以使用“小时:分钟:秒”格式输出,其中包含 `

$hoursminsandsecs = date('H:i:s',$numberofsecs);

如果超过一天,您需要使用模运算来计算天数,因为这是纪元开始日期变得相关的地方。

希望能有所帮助。


你会如何“使用模运算来计算天数”? - Tilman Koester
在 PHP 中,使用百分号符号(%)进行取模运算。其他的答案已经展示了如何做取模,这就是为什么我没有写。 - Spudley
如果你只显示天数而不是年份,那么可以从你的$numberofsecs中减去一天(以秒为单位)吗?if ($numberofsecs > 86400) $numberofsec -= 86400; 这样就有效地从1970年1月0日开始计算了。 - Tilman Koester
3
永远不要做这件事!它是神秘错误的源头。要理解原因,请将时区设置为UTC+1并打印date(0)。结果将会是3:00。 - Samuel Hapak
@SamuelHapak - 呵呵。没错。当然,我建议每个人都将自己的时区设置为UCT,因为当您的系统时钟遵循夏令时更改时,使用本地时区会出现问题。(那么,为什么要将其设置为除本地时间或UCT之外的任何其他时间呢?) - Spudley
如果秒数在0到1天之间,这是正确的方法。只需确保使用**gmdate()**而不是date(),否则它将依赖于时区。 - Tobia

14

或许最简单的方法是:

gmdate('H:i:s', $your_time_in_seconds);

如果时区不是UTC,它将无法工作。 - Evan Lee
这甚至在24小时内都无法工作。 - user151496

11

$time 为以秒为单位的时间。

$seconds = $time % 60;
$time = ($time - $seconds) / 60;
$minutes = $time % 60;
$hours = ($time - $minutes) / 60;

现在,小时、分钟和秒分别为$hours$minutes$seconds


谢谢您的回复;您如何限制 $hours、$minutes 和 $seconds 的结果仅为整数? - Jeff Solomon

10

另一种解决方案可以将传入的秒数转换成天、小时、分钟和秒:

function seconds_to_time($secs)
{
    $dt = new DateTime('@' . $secs, new DateTimeZone('UTC'));
    return array('days'    => $dt->format('z'),
                 'hours'   => $dt->format('G'),
                 'minutes' => $dt->format('i'),
                 'seconds' => $dt->format('s'));
}

print_r(seconds_to_time($seconds_value);

如果时间超过一年,则需要额外的逻辑来处理“天数”。使用 str_pad()ltrim() 函数来添加/删除前导零。


9

ITroubs的答案没有处理剩余的秒数,当你想使用这段代码将秒数转换为时间格式如小时: 分钟: 秒时。

这是我处理它的方法:(这还会为一位数的分钟和秒数添加前导零)

$seconds = 3921; //example

$hours = floor($seconds / 3600);
$mins = floor(($seconds - $hours*3600) / 60);
$s = $seconds - ($hours*3600 + $mins*60);

$mins = ($mins<10?"0".$mins:"".$mins);
$s = ($s<10?"0".$s:"".$s); 

$time = ($hours>0?$hours.":":"").$mins.":".$s;

在这个例子中,$time将包含"1:05:21"。


7
如果您需要硬编码,可以像其他人建议的那样使用模数提取时间。
如果您从MySQL数据库返回秒数,并且假设您不需要在应用程序中以秒格式使用数据,则有一种更简洁的方法,您可以使用MySQL的SEC_TO_TIME函数,它将以hh:mm:ss格式返回时间。
例如。
SELECT SEC_TO_TIME(my_seconds_field) AS my_timestring;

请注意,SEC_TO_TIME函数的时间范围限制为838:59:59 (http://bugs.mysql.com/bug.php?id=29381)。 - Nitsan Baleli

3

something like this?

if(is_numeric($time)){
    $value = array(
        "years" => 0, "days" => 0, "hours" => 0,
        "minutes" => 0, "seconds" => 0,
    );
    if($time >= 31556926){
        $value["years"] = floor($time/31556926);
        $time = ($time%31556926);
    }
    if($time >= 86400){
        $value["days"] = floor($time/86400);
        $time = ($time%86400);
    }
    if($time >= 3600){
        $value["hours"] = floor($time/3600);
        $time = ($time%3600);
    }
    if($time >= 60){
        $value["minutes"] = floor($time/60);
        $time = ($time%60);
    }

    $value["seconds"] = floor($time);
    return (array) $value;
    
} else{
    return (bool) FALSE;
}

grabbed from: http://www.ckorp.net/sec2time.php


天数部分忽略夏令时,年份部分则忽略夏令时和闰年。 - Spudley

3

抱歉回复晚了,但希望这对你有所帮助。

function mediaTimeDeFormater($seconds)
{
    if (!is_numeric($seconds))
        throw new Exception("Invalid Parameter Type!");


    $ret = "";

    $hours = (string )floor($seconds / 3600);
    $secs = (string )$seconds % 60;
    $mins = (string )floor(($seconds - ($hours * 3600)) / 60);

    if (strlen($hours) == 1)
        $hours = "0" . $hours;
    if (strlen($secs) == 1)
        $secs = "0" . $secs;
    if (strlen($mins) == 1)
        $mins = "0" . $mins;

    if ($hours == 0)
        $ret = "$mins:$secs";
    else
        $ret = "$hours:$mins:$secs";

    return $ret;
}

echo mediaTimeDeFormater(216.064000);//3:36

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