我正在使用我的 iTunes 库从大约 1,100 个 mp3 中获取数据,并且在将库的持续时间设置为分钟和秒时遇到了一个小问题。
$duration = 1893642;
$minutes = bcmod(($duration / 60), 60);
$seconds = bcmod($duration, 60);
echo $minutes.":".$seconds; //returns 0:42
问题是这个特定的 MP3 实际上是 31:42。关于为什么这不起作用的任何想法?
$minutes = bcmod(($duration / 60), 60);
正在以 60 为模。除非您的曲目超过一个小时,否则它将始终显示 0。您希望它是
$minutes = floor($duration / 60);
试试这个功能
function formatTime($secs) {
$times = array(3600, 60, 1);
$time = '';
$tmp = '';
for($i = 0; $i < 3; $i++) {
$tmp = floor($secs / $times[$i]);
if($tmp < 1) {
$tmp = '00';
}
elseif($tmp < 10) {
$tmp = '0' . $tmp;
}
$time .= $tmp;
if($i < 2) {
$time .= ':';
}
$secs = $secs % $times[$i];
}
return $time;
}
不确定在编写此问题时是否可以使用以下功能,但由于这是我一直在问自己的问题,所以就这样吧。
我使用了上面的答案:
$seconds = bcmod($row{'playtime_seconds'}, 60);
$minutes = floor($row{'playtime_seconds'} / 60);
$hours = floor($minutes / 60);
这在大多数情况下都有效,但没有填充 - 所以你可以在应该是 20:01 的时候得到 20:1 - 而且超过一个小时不是很好 - 一个长度在 length="1: 70:9" - 所以另一种选择是使用“日期”功能。
<?=date("H:i:s", $duration); ?>
从该秒数返回00:31:42
$duration_str = sprintf('%s:%02s:%02s',
floor($duration_int / 3600), // hours
floor($duration_int / 60) - floor($duration_int / 3600) * 60, // minutes
$duration_int % 60); // seconds
这些*printf
函数提供格式。在这种情况下,前导零。
分钟线是最复杂的部分,因为您必须计算小时(持续时间 [s] / 3600 [s/h]),然后向下舍入到整数 ( floor()
),然后乘以 60 以转换为分钟,然后减去从总分钟数(持续时间 [s] / 60 [s/m])。
如果您的持续时间短于一个小时,则代码要简单得多:
$duration_str = sprintf('%s:%02s', floor($duration_int / 60), $duration_int % 60);
对于超过 59 分钟的持续时间,结果仍然正确,但可读性较差(示例中为 31560 分钟)。