Convert time in HH:MM:SS format to seconds only?
如何将格式HH:MM:SS的时间转换为平秒数?
附: 时间有时可能只有格式MM:SS。
不需要explode任何东西:
1 2 3 4 5 6 7
| $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; |
如果您不想使用正则表达式:
1 2 3 4 5
| $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不存在,这不会破裂吗?
-
只是固定它所以它不会。
-
当使用时间函数时,我不得不乱用时区来使它正确,但这更简单。
-
最后一行错误:$time_seconds = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes;应为$time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;
我认为最简单的方法是使用strtotime()函数:
1 2 3 4 5 6 7 8 9
| $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()也可用于解析日期和时间:
1 2 3
| $time = '21:30:10';
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60 + $parsed['second']; |
demo
如果您将使用strtotime()或date_parse()解析格式MM:SS,它将失败(date_parse()用于strtotime()和DateTime),因为当您输入格式如xx:yy时,解析器假定它而不是MM:SS。我建议检查格式,如果只有MM:SS,则前缀00:。
demo strtotime() demo date_parse()
如果你有超过24小时,那么你可以使用下一个功能(它适用于MM:SS和HH:MM:SS格式):
1 2 3 4 5
| function TimeToSec ($time) {
$sec = 0;
foreach (array_reverse(explode(':', $time)) as $k => $v) $sec += pow(60, $k) * $v;
return $sec;
} |
demo
-
strtotime()不允许小时数超过24小时 - 使用25或更高时间将返回"false"。
-
@Sven:我更新了答案。
-
超过24小时的第3个答案正是我所需要的。 array_reverse然后在:上爆炸然后再次通过foreach和另一个pow(因此hh:mm和hh:mm:ss都可以在不修改函数的情况下工作)是一个天才之笔。代码卓越。我很难想象一个更有效的例子。谢谢!
-
@Glavi? unix零日期非常巧妙
-
@Glavi?有些人对我也有帮助
-
如果它包含像00:20:55.60000那样的点.怎么办?我试着发一个问题,但似乎有问题。
-
@KeepMove:删除微秒,将它们绕到秒部分。
-
我只是看了第一个答案,并想,如果我使用了Unix纪元,那么我的投票结果如何!
在伪代码中:
1 2
| split it by colon
seconds = 3600 * HH + 60 * MM + SS |
-
这是PHP吗? 80
-
正如他所写,这是伪代码。"假装代码"来解释如何完成某些事情。
试试这个:
1 2 3 4 5 6 7 8 9
| $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秒的答案。
-
现在就试试。当然,您可以传递类似"898989:8989898:899899"的内容,但我假设将在代码达到秒计算之前输入的时间进行基本验证。
您可以使用strtotime函数返回today 00:00:00的秒数。
-
虽然此代码段可以解决问题,但包括解释确实有助于提高帖子的质量。请记住,您将来会回答读者的问题,而这些人可能不知道您的代码建议的原因。还请尽量不要在代码中加上解释性注释,这会降低代码和解释的可读性!
简单
1 2 3 4 5 6 7 8
| 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;
} |
1 2 3 4 5 6 7 8 9 10
| <?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怎么办?
-
那它就行不通了。您显然需要先验证格式。并删除前$秒+ =部分
-
阵列翻转$ parts怎么样?我是天才!
-
如何翻转阵列有帮助?
-
好吧,它会以正确的方式计算
-
否..如果HH不存在,则翻转阵列将导致秒被视为小时。