2

我正在使用我的 iTunes 库从大约 1,100 个 mp3 中获取数据,并且在将库的持续时间设置为分钟和秒时遇到了一个小问题。

$duration = 1893642;
$minutes = bcmod(($duration / 60), 60);
$seconds = bcmod($duration, 60);
echo $minutes.":".$seconds; //returns 0:42

问题是这个特定的 MP3 实际上是 31:42。关于为什么这不起作用的任何想法?

4

4 回答 4

5
$minutes = bcmod(($duration / 60), 60);

正在以 60 为模。除非您的曲目超过一个小时,否则它将始终显示 0。您希望它是

$minutes = floor($duration / 60);
于 2011-02-02T19:45:40.913 回答
2

试试这个功能

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;
}
于 2011-02-02T19:50:22.510 回答
1

不确定在编写此问题时是否可以使用以下功能,但由于这是我一直在问自己的问题,所以就这样吧。

我使用了上面的答案:

$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

于 2012-03-23T15:02:59.340 回答
0
$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 分钟)。

于 2022-01-29T07:36:14.060 回答