将HH:MM:SS格式的时间仅转换为秒?


75

如何将时间格式HH:MM:SS转换为固定的秒数?

PS Time有时可能MM:SS仅采用格式。

Answers:


136

不需要explode任何东西:

$str_time = "23:12:95";

$str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00:$1:$2", $str_time);

sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);

$time_seconds = $hours * 3600 + $minutes * 60 + $seconds;

如果您不想使用正则表达式:

$str_time = "2:50";

sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);

$time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;

甜蜜的解决方案。但是,如果没有HH,就不会休息吗?
simme 2011年

只需修复它就可以了。
蒂姆·库珀

1
使用时间函数时,我不得不弄乱时区以使其正确,但这要简单得多。
datagutten

最后一行错误:$time_seconds = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes; 应该是$time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;
Andrew Lazarus

105

我认为最简单的方法是使用strtotime()功能:

$time = '21:30:10';
$seconds = strtotime("1970-01-01 $time UTC");
echo $seconds;

// same with objects (for php5.3+)
$time = '21:30:10';
$dt = new DateTime("1970-01-01 $time", new DateTimeZone('UTC'));
$seconds = (int)$dt->getTimestamp();
echo $seconds;

demo


函数date_parse()也可以用于解析日期和时间:

$time = '21:30:10';
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60 + $parsed['second'];

demo


如果您要MM:SS使用strtotime()或来解析格式,date_parse()则将失败(date_parse()strtotime()和中使用DateTime),因为当您输入类似xx:yyparser的格式时,就会假设它是HH:MMand not MM:SS。我建议您检查格式,00:如果只有,请添加MM:SS

demo strtotime() demo date_parse()


如果你有时间超过24,那么你可以使用下面的函数(它会为工作MM:SSHH:MM:SS格式):

function TimeToSec($time) {
    $sec = 0;
    foreach (array_reverse(explode(':', $time)) as $k => $v) $sec += pow(60, $k) * $v;
    return $sec;
}

demo


1
strtotime()不允许小时数超过24-使用25或更高的值将返回“ false”。
2015年

1
您在24小时内的第三个答案正是我所需要的。的array_reverse和爆炸上:然后通过使一个多行程foreach和另一个pow(使得两个HH:MMHH:MM:SS无功能的变形例的工作)是天才的行程。卓越的代码。我很难想象一个更有效的例子。谢谢!
FirstFraktal

@Glavić某些方式对我也有帮助
Abdulla Nilam

1
我只是看了第一个答案,然后想到,如果我使用Unix时代……该由我投票赞成!
退出

1
第三个选项适用于我可以抛出的每种有效格式。👍–
Synetech


8

用伪代码:

split it by colon
seconds = 3600 * HH + 60 * MM + SS

6
如他所写,它是伪代码。“伪装代码”解释如何完成某事。
simme 2011年

不论是否为伪代码都没有关系,因为问题要求支持MM:SS格式,而该答案不需要。
Synetech

5

尝试这个:

$time = "21:30:10";
$timeArr = array_reverse(explode(":", $time));
$seconds = 0;
foreach ($timeArr as $key => $value)
{
    if ($key > 2) break;
    $seconds += pow(60, $key) * $value;
}
echo $seconds;

我喜欢它!$ time =“ 01:23:54:21:30:10”给了我1087421410秒的答案。
罗杰·哈里伯顿

2
现在就试试。当然,您可以传递“ 898989:8989898:899899”之类的信息,但是我认为基本验证将在代码到达秒数计算之前的输入时间进行。
Chandu

5

您可以使用strtotime函数从返回秒数today 00:00:00

$seconds= strtotime($time) - strtotime('00:00:00');

1
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。也请尽量不要在代码中加入解释性注释,这会降低代码和解释的可读性!
Filnor

2

简单

function timeToSeconds($time)
{
     $timeExploded = explode(':', $time);
     if (isset($timeExploded[2])) {
         return $timeExploded[0] * 3600 + $timeExploded[1] * 60 + $timeExploded[2];
     }
     return $timeExploded[0] * 3600 + $timeExploded[1] * 60;
}

0
<?php
$time    = '21:32:32';
$seconds = 0;
$parts   = explode(':', $time);

if (count($parts) > 2) {
    $seconds += $parts[0] * 3600;
}
$seconds += $parts[1] * 60;
$seconds += $parts[2];

如果没有时间只有32:32怎么办?
瑞安

1
那就行不通了。显然,您首先需要验证格式。并删除第一个$ seconds + =部分
simme 2011年

翻转数组有什么帮助?
simme 2011年

否。如果不存在HH,则翻转阵列将导致秒数被视为小时。
simme 2011年

0
function time2sec($time) {
    $durations = array_reverse(explode(':', $item->duration));
    $second = array_shift($durations);
    foreach ($durations as $duration) {
        $second += (60 * $duration);
    }
    return $second;
}
echo time2sec('4:52'); // 292
echo time2sec('2:01:42'); // 7302
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.