我有以 HH:MM:SS 格式存储的视频时长。我想将其显示为 HH 小时、MM 分钟、SS 秒。如果小于 1,则不应显示小时数。
最好的方法是什么?
像这样的东西?
$vals = explode(':', $duration);
if ( $vals[0] == 0 )
$result = $vals[1] . ' minutes, ' . $vals[2] . ' seconds';
else
$result = $vals[0] . 'hours, ' . $vals[1] . ' minutes, ' . $vals[2] . ' seconds';
尝试使用拆分
list($hh,$mm,$ss)= split(':',$duration);
一个小小的改变可能是:
$vals = explode(':', $duration);
if ( $vals[0] == 0 )
$result = "{$vals[1]} minutes, {$vals[2]} seconds";
else
$result = "{$vals[0]} hours, {$vals[1]} minutes, {$vals[2]} seconds";
很简单:
list( $h, $m, $s) = explode(':', $hms);
echo ($h ? "$h hours, " : "").($m ? "$m minutes, " : "").(($h || $m) ? "and " : "")."$s seconds";
这将只显示小时或分钟(如果有),如果有小时、分钟或两者都显示,则在秒前插入一个“和”。如果你想变得非常花哨,你可以添加一些代码来适当地显示“小时”与“小时”,分钟和秒也是如此。
当 php 处理时间很好时,为什么还要打扰正则表达式或爆炸?
$sTime = '04:20:00';
$oTime = new DateTime($sTime);
$aOutput = array();
if ($oTime->format('G') > 0) {
$aOutput[] = $oTime->format('G') . ' hours';
}
$aOutput[] = $oTime->format('i') . ' minutes';
$aOutput[] = $oTime->format('s') . ' seconds';
echo implode(', ', $aOutput);
The benefit is that you can reformat the time however you like (including am/pm, adjustments for timezone, addition / subtraction, etc).
这是一种不同的方式,具有不同的功能,对新手来说更开放,更循序渐进。它还处理 1 小时和许多小时......您可以尝试使用相同的逻辑来处理 0 分钟和 0 秒。
<?php
// your time
$var = "00:00:00";
if(substr($var, 0, 2) == 0){
$myTime = substr_replace(substr_replace($var, '', 0, 3), ' Minutes, ', 2, 1);
}
elseif(substr($var, 1, 1) == 1){
$myTime = substr_replace(substr_replace($var, ' Hour, ', 2, 1), ' Minutes, ', 11, 1);
}
else{
$myTime = substr_replace(substr_replace($var, ' Hours, ', 2, 1), ' Minutes, ', 12, 1);
}
// work with your variable
echo $myTime .' Seconds';
?>
如果您真的想使用内置函数,也许是为了健壮性,您可以尝试
date_default_timezone_set('UTC');
$date = strtotime($hms,0);
并使用任何日期格式化函数(date()
、strftime()
等)以您希望的任何方式格式化时间。或者您可以使用strptime($hms,'%T')
. 对于您拥有的简单场景,两者都可能是矫枉过正。
我会用不同的方法来回答这个问题。我的方法是以秒为单位存储长度。然后根据需要,很容易将这些秒渲染为 hh:mm:ss 使用:
print gmdate($seconds >= 3600 ? 'H:i:s' : 'i:s', $seconds);
(对于你的问题)
或在数据库中搜索长度:
SELECT * FROM videos WHERE length > 300;
例如,搜索时长超过 5 分钟的视频。
explode() 用于三色紫罗兰。这是正则表达式的工作!
<?php
preg_match('/^(\d\d):(\d\d):(\d\d)$/', $video_duration, $parts);
if ($parts[1] !== '00') {
echo("{$parts[1]} hours, {$parts[2]} minutes, {$parts[3]} seconds");
}
else {
echo("{$parts[2]} minutes, {$parts[3]} seconds");
}
完全未经测试,但类似的东西应该可以工作。请注意,此代码假定小时片段将始终为两位数(例如,三小时视频将03:00:00
代替3:00:00
)。
编辑:回想起来,为此使用正则表达式可能是过度设计的情况;explode() 也可以完成这项工作,在这种情况下甚至可能更快。但是当我阅读这个问题时,这是第一个想到的方法。
在 PHP 中将 00:00:00 转换为小时、分钟和秒非常容易。
$小时 = 0; $分钟 = 0; $秒 = 0;