Conversión de milisegundos a minutos y segundos con Javascript


La API de Soundcloud da la duración de sus pistas en milisegundos. JSON se ve así:

"duration": 298999

He probado muchas funciones que encontré aquí en vano. Solo estoy buscando algo para convertir ese número a algo como se ve así:

4:59

Aquí hay uno que se acercó, pero no funciona. No detiene los segundos a los 60. Va hasta el 99, lo que no tiene sentido. Intente introducir "187810" como un valor de ms, por ejemplo.

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

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

Gracias por su ¡Socorro!

Si pudiera agregar apoyo durante horas, también, le estaría agradecido.

Author: JAL, 2014-01-23

5 answers

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"

Como Usuario HelpingHand señalado en los comentarios la declaración return debe ser

Retorno (segundos == 60 ? (minutos+1) + ":00" : minutos + ":" + (segundos

 87
Author: maerics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-23 17:34:28
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"

También si quieres las horas, usa d.getUTCHours().

 8
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-22 21:33:39

Probablemente hay una mejor manera de hacer esto, pero hace el trabajo:

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);

No estoy seguro de por qué tiene el operador

Obtener el resto de los minutos con % le da el porcentaje de segundos transcurridos en ese minuto, por lo que multiplicarlo por 60 le da la cantidad de segundos y el piso lo hace más apto para la visualización, aunque también podría obtener precisión de sub-segundo si querer.

Si los segundos son menos de 10, desea mostrarlos con un cero inicial.

 1
Author: rgrwkmn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-22 21:43:37

Evento sin embargo ,oment.js no proporciona dicha funcionalidad, si viene aquí y ya está usando moment.js, prueba esto:

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

Obtendrás algo como x:xx:xx.

En el caso de que desee saltar la hora, cuando la duración es sólo

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");
  }
}

Esta solución en moment se introdujo en este problema .

 1
Author: Robin Wieruch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-18 21:49:28

Este código hará un mejor trabajo si desea mostrar horas, y centisegundos o milisegundos después de segundos como 1:02:32.21 y si se usa en un teléfono celular, el temporizador mostrará la sincronización correcta incluso después del bloqueo de pantalla.

<div id="timer" style="font-family:monospace;">00:00<small>.00</small></div>

<script>
var d = new Date();
var n = d.getTime();
var startTime = n;

var tm=0;
function updateTimer(){
  d = new Date();
  n = d.getTime();
  var currentTime = n;  
  tm = (currentTime-startTime);
  
  //tm +=1; 
  // si el timer cuenta en centesimas de segundo
  //tm = tm*10;
  
  var hours = Math.floor(tm / 1000 / 60 / 60);
  var minutes = Math.floor(tm / 60000) % 60;
  var seconds =  ((tm / 1000) % 60);
  // saca los decimales ej 2 d{0,2}
  var seconds = seconds.toString().match(/^-?\d+(?:\.\d{0,-1})?/)[0];
  var miliseconds = ("00" + tm).slice(-3);
  var centiseconds;

  
  // si el timer cuenta en centesimas de segundo
  //tm = tm/10;


  centiseconds = miliseconds/10;
  centiseconds = (centiseconds).toString().match(/^-?\d+(?:\.\d{0,-1})?/)[0];

  minutes = (minutes < 10 ? '0' : '') + minutes;
  seconds = (seconds < 10 ? '0' : '') + seconds;
  centiseconds = (centiseconds < 10 ? '0' : '') + centiseconds;
  hours = hours + (hours > 0 ? ':' : '');
  if (hours==0){
    hours='';
  }

  document.getElementById("timer").innerHTML = hours + minutes + ':' + seconds + '<small>.' + centiseconds + '</small>';
}

var timerInterval = setInterval(updateTimer, 10);
// clearInterval(timerInterval);
</script>
 -2
Author: Ricardo Lerch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-17 17:30:57