2011-02-02 2 views
2

J'utilise ma bibliothèque iTunes pour obtenir des données sur environ 1 100 mp3 et je rencontre un petit problème pour obtenir la durée de la bibliothèque en minutes et secondes.Conversion de la durée MP3

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

Le problème est que ce MP3 spécifique est en réalité 31:42. Des pensées sur pourquoi cela ne fonctionne pas?

Répondre

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

prend les minutes modulo 60. À moins que votre piste est plus d'une heure, il dira toujours 0. Vous voulez qu'il soit

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

Vous dites donc pendant quelques secondes que je devrais éviter 'bcmod()' aussi bien? Je ne comprends pas ce que 'bcmod()' fait, quelqu'un dans un autre post de stackoverflow m'a dit de le faire, pour la plupart d'entre eux il semble bien fonctionner. – Webnet

+0

'bcmod' prend le module à une précision arbitraire. Fondamentalement, 'bcmod ($ a, $ b)' signifie '$ a% $ b'. Les fonctions commençant par bc- proviennent de l'extension BCMath. Ils vous permettent d'effectuer des calculs de précision arbitraire. À moins que vos besoins ne nécessitent une résolution d'une microseconde (ce dont je doute), il n'y a pas grand-chose à y faire. De plus, ces fonctions stockent les nombres sous la forme d'une chaîne, donc quand vous faites une division ordinaire, ils seront transformés en types ordinaires et vous perdrez la précision. –

+0

Ce code ne fonctionnera que si ce qu'il veut est le format suivant: "MM: SS" (même si c'est plus d'une heure) mais s'il veut le "HH: MM: SS" ça ne marchera pas ..... Donc techniquement La fonction de Wasim Karani est correcte. (Je n'ai pas un score assez élevé pour downvote cela, mais il devrait être voté en bas.) – josephtikva1

2

Essayez cette fonction

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

Vous ne savez pas si la fonction suivante était disponible lorsque cette question a été écrite, mais comme c'est une question que je me suis posée alors voilà.

J'ai utilisé la réponse ci-dessus:

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

Ce qui fonctionne pour la plupart des temps, mais il n'y a pas de remplissage - donc vous pouvez vous retrouver avec 20: 1 quand il devrait être 20h01 - et Ce n'est pas bon pendant plus d'une heure - une longueur arrive en longueur = "1: 70: 9" - donc une alternative est d'utiliser la fonction "date".

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

qui retourne 00:31:42 de ce nombre de secondes

Questions connexes