web-dev-qa-db-fra.com

Conversion de millisecondes en minutes et secondes avec Javascript

L'API de Soundcloud donne la durée de ses pistes en millisecondes. JSON ressemble à ceci:

"duration": 298999

J'ai essayé de nombreuses fonctions que j'ai trouvées ici sans succès. Je cherche simplement quelque chose pour convertir ce nombre en quelque chose qui ressemble à ceci:

4:59

En voici un qui se rapproche mais ne fonctionne pas. Cela n'arrête pas les secondes à 60. Cela va jusqu'à 99, ce qui n'a aucun sens. Essayez d'entrer "187810" en tant que valeur ms, par exemple.

var ms = 298999,
min = Math.floor((ms/1000/60) << 0),
sec = Math.floor((ms/1000) % 60);

console.log(min + ':' + sec);

Merci de votre aide!

Si vous pouviez ajouter du support pendant des heures également, je vous en serais reconnaissant.

42
ElliotD
function millisToMinutesAndSeconds(millis) {
  var minutes = Math.floor(millis / 60000);
  var seconds = ((millis % 60000) / 1000).toFixed(0);
  return minutes + ":" + (seconds < 10 ? '0' : '') + seconds;
}

millisToMinutesAndSeconds(298999); // "4:59"
millisToMinutesAndSeconds(60999);  // "1:01"

Comme l'utilisateur HelpingHand indiqué dans les commentaires, l'instruction return devrait être

retour (secondes == 60? (minutes + 1) + ": 00": minutes + ":" + (secondes <10? "0": "") + secondes);

113
maerics
var ms = 298999;
ms = 1000*Math.round(ms/1000); // round to nearest second
var d = new Date(ms);
console.log( d.getUTCMinutes() + ':' + d.getUTCSeconds() ); // "4:59"

Aussi, si vous voulez les heures, utilisez d.getUTCHours().

13
Matt

Voici ma contribution si vous cherchez

h: mm: ss

au lieu comme je l'étais:

function msConversion(millis) {
  let sec = Math.floor(millis / 1000);
  let hrs = Math.floor(sec / 3600);
  sec -= hrs * 3600;
  let min = Math.floor(sec / 60);
  sec -= min * 60;

  sec = '' + sec;
  sec = ('00' + sec).substring(sec.length);

  if (hrs > 0) {
    min = '' + min;
    min = ('00' + min).substring(min.length);
    return hrs + ":" + min + ":" + sec;
  }
  else {
    return min + ":" + sec;
  }
}
1
HelpingHand

Il y a probablement une meilleure façon de le faire, mais le travail est fait:

var ms = 298999;
var min = ms / 1000 / 60;
var r = min % 1;
var sec = Math.floor(r * 60);
if (sec < 10) {
    sec = '0'+sec;
}
min = Math.floor(min);
console.log(min+':'+sec);

Vous ne savez pas pourquoi vous avez << l'opérateur dans votre ligne de minutes, je ne pense pas qu'il soit nécessaire de simplement lire les minutes avant l'affichage.

Obtenir le reste des minutes avec% vous donne le pourcentage de secondes écoulées dans cette minute. Par conséquent, si vous le multipliez par 60, vous obtenez le nombre de secondes et le revêtement de sol le rend plus facile à afficher, mais vous pouvez également obtenir une précision inférieure à la seconde si vous le souhaitez. vouloir.

Si le nombre de secondes est inférieur à 10, vous souhaitez les afficher avec un zéro non significatif.

1
rgrwkmn

Évidemment, oment.js ne fournit pas une telle fonctionnalité. Si vous venez ici et que vous utilisez déjà moment.js, essayez ceci:

function formatDuration(ms) {
  var duration = moment.duration(ms);
  return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
}

Vous obtiendrez quelque chose comme x: xx: xx.

Dans le cas où vous voudrez peut-être sauter l'heure, lorsque la durée est seulement <60 minutes.

function formatDuration(ms) {
  var duration = moment.duration(ms);
  if (duration.asHours() > 1) {
    return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
  } else {
    return moment.utc(duration.asMilliseconds()).format("mm:ss");
  }
}

Cette solution de contournement en moment a été introduite dans ce Issue .

1
Robin Wieruch