2011-02-02 4 views
2

Я использую свою библиотеку iTunes для получения данных из примерно 1100 mp3-файлов, и я столкнулся с небольшой проблемой в обеспечении продолжительности библиотеки в минутах и ​​секундах.Конвертирование продолжительности MP3-времени

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

Проблема в том, что этот конкретный MP3 на самом деле 31:42. Любые мысли о том, почему это не работает?

ответ

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

занимает минуты по модулю 60. Если ваш трек не более часа, он всегда будет говорить 0. Вы хотите быть

$minutes = floor($duration/60); 
+0

Так вы говорите, на несколько секунд следует избегать 'bcmod()', а? Я не понимаю, что делает 'bcmod()', кто-то из другого столбца stackoverflow сказал мне сделать это, потому что для большинства из них он работает нормально. – Webnet

+0

'bcmod' принимает модуль произвольной точностью. В принципе, 'bcmod ($ a, $ b)' означает '$ a% $ b'. Функции, начинающиеся с bc-, относятся к расширению BCMath. Они позволяют выполнять вычисления с произвольной точностью. Если ваши потребности не требуют разрешения на микросекунду (что я сомневаюсь), в этом нет особого смысла. Кроме того, эти функции сохраняют числа в виде строки, поэтому, когда вы выполняете обычное разделение, они будут переданы обычным типам, и вы потеряете точность. –

+0

Этот код будет работать только в том случае, если ему нужен следующий формат: «MM: SS» (даже больше часа), но если он хочет, чтобы «HH: MM: SS» это не работало ..... Так технически Функция Вазима Карани правильная. (У меня недостаточно высокий балл, чтобы уменьшить это, но он должен быть проголосован.) – josephtikva1

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; 
} 
2

Не знаю, была ли доступна следующая функция, когда этот вопрос был написан, но поскольку это вопрос, который я задавал себе так и здесь.

Я использовал ответ выше:

$seconds = bcmod($row{'playtime_seconds'}, 60); 
$minutes = floor($row{'playtime_seconds'}/60); 
$hours = floor($minutes/60); 

Который работает для большинства раз, но нет обивка - так что вы можете в конечном итоге с 20: 1, когда она должна быть 20:01 - и это не к лучшему в течение часа - одна длина длится = «1: 70: 9», поэтому альтернативой является использование функции «дата».

<?=date("H:i:s", $duration); ?> 

который возвращает 00:31:42 из этого количества секунд

 Смежные вопросы

  • Нет связанных вопросов^_^