78 votes

millisecondes à temps en javascript

J'ai cette fonction qui formate les secondes au temps

 function secondsToTime(secs){
    var hours = Math.floor(secs / (60 * 60));
    var divisor_for_minutes = secs % (60 * 60);
    var minutes = Math.floor(divisor_for_minutes / 60);
    var divisor_for_seconds = divisor_for_minutes % 60;
    var seconds = Math.ceil(divisor_for_seconds);
    return minutes + ":" + seconds; 
}

il fonctionne très bien mais j'ai besoin d'une fonction pour transformer les millisecondes en temps et je n'arrive pas à comprendre ce que je dois faire à cette fonction pour retourner le temps dans ce format.

mm:ss.mill
01:28.5568

3 votes

Voyons voir ici 1 seconde = 1000ms donc...

1 votes

En ce qui me concerne, 1000 ms font une seconde, alors comment pouvez-vous avoir un nombre à 4 chiffres dans la zone ms ?

145voto

RobG Points 41170

Beaucoup de revêtements de sol inutiles dans les autres réponses. Si la chaîne est en millisecondes, convertissez-la en h:m:s comme suit :

function msToTime(s) {
  var ms = s % 1000;
  s = (s - ms) / 1000;
  var secs = s % 60;
  s = (s - secs) / 60;
  var mins = s % 60;
  var hrs = (s - mins) / 60;

  return hrs + ':' + mins + ':' + secs + '.' + ms;
}

Si vous voulez qu'il soit formaté en hh:mm:ss.sss, utilisez :

function msToTime(s) {

  // Pad to 2 or 3 digits, default is 2
  function pad(n, z) {
    z = z || 2;
    return ('00' + n).slice(-z);
  }

  var ms = s % 1000;
  s = (s - ms) / 1000;
  var secs = s % 60;
  s = (s - secs) / 60;
  var mins = s % 60;
  var hrs = (s - mins) / 60;

  return pad(hrs) + ':' + pad(mins) + ':' + pad(secs) + '.' + pad(ms, 3);
}

console.log(msToTime(55018))

Grâce à certaines fonctionnalités linguistiques récemment ajoutées, la fonction de pad peut être plus concise :

function msToTime(s) {
    // Pad to 2 or 3 digits, default is 2
  var pad = (n, z = 2) => ('00' + n).slice(-z);
  return pad(s/3.6e6|0) + ':' + pad((s%3.6e6)/6e4 | 0) + ':' + pad((s%6e4)/1000|0) + '.' + pad(s%1000, 3);
}

// Current hh:mm:ss.sss UTC
console.log(msToTime(new Date() % 8.64e7))

80voto

VisioN Points 62518

Voici ma solution préférée en une seule phrase :

new Date(12345 * 1000).toISOString().slice(11, -1);  // "03:25:45.000"

Méthode Date.prototype.toISOString() renvoie une chaîne de caractères dans le format ISO étendu simplifié ( ISO 8601 ), qui comporte toujours 24 caractères : YYYY-MM-DDTHH:mm:ss.sssZ . Cette méthode est prise en charge par tous les navigateurs modernes (IE9+) et Node.

Cette ligne unique est limitée à une plage d'un jour, ce qui est parfait si vous l'utilisez pour formater des millisecondes jusqu'à 24 heures (c'est à dire ms < 86400000 ). Le code suivant est capable de formater correctement n'importe quel nombre de millisecondes (mis en forme dans une méthode prototype très pratique) :

/**
 * Convert (milli)seconds to time string (hh:mm:ss[:mss]).
 *
 * @param Boolean seconds
 *
 * @return String
 */
Number.prototype.toTimeString = function(seconds) {
    var _24HOURS = 8.64e7;  // 24*60*60*1000

    var ms = seconds ? this * 1000 : this,
        endPos = ~(4 * !!seconds),  // to trim "Z" or ".sssZ"
        timeString = new Date(ms).toISOString().slice(11, endPos);

    if (ms >= _24HOURS) {  // to extract ["hh", "mm:ss[.mss]"]
        var parts = timeString.split(/:(?=\d{2}:)/);
        parts[0] -= -24 * Math.floor(ms / _24HOURS);
        timeString = parts.join(":");
    }

    return timeString;
};

console.log( (12345 * 1000).toTimeString()     );  // "03:25:45.000"
console.log( (123456 * 789).toTimeString()     );  // "27:03:26.784"
console.log(  12345.       .toTimeString(true) );  // "03:25:45"
console.log(  123456789.   .toTimeString(true) );  // "34293:33:09"

27voto

Richard J. Ross III Points 33152
function millisecondsToTime(milli)
{
      var milliseconds = milli % 1000;
      var seconds = Math.floor((milli / 1000) % 60);
      var minutes = Math.floor((milli / (60 * 1000)) % 60);

      return minutes + ":" + seconds + "." + milliseconds;
}

2 votes

Utilisation de Math.floor pour secondes y minutes pourrait être une bonne idée.

0 votes

Math.floor n'est pas nécessaire pour les millisecondes.

0 votes

@RobG Ce n'était pas une question de millisecondes, c'était une question de 2 lignes dans le code de Richard.

16voto

sissonb Points 1763

Pourquoi ne pas utiliser l'objet Date comme ceci ?

let getTime = (milli) => {
  let time = new Date(milli);
  let hours = time.getUTCHours();
  let minutes = time.getUTCMinutes();
  let seconds = time.getUTCSeconds();
  let milliseconds = time.getUTCMilliseconds();
  return hours + ":" + minutes + ":" + seconds + ":" + milliseconds;
}

https://jsfiddle.net/4sdkpso7/6/

1 votes

Lorsque j'ajoute 18000 (c'est-à-dire 18 secondes en millisecondes) et que j'appelle time.getMinutes(), il renvoie 30 minutes, et time.getSeconds() renvoie 18 secondes, car je vois que getMinutes considère l'entrée comme si elle était en secondes, alors que getSeconds la considère en millisecondes. Dans mon cas, j'ai besoin que la sortie soit de 0 minute 18 secondes.

0 votes

@RajshekarReddy J'ai résolu ce problème en utilisant les getters UTC.

3voto

Ewald Bos Points 403

Voici un filtre à utiliser :

app.filter('milliSecondsToTimeCode', function () {
    return function msToTime(duration) {
        var milliseconds = parseInt((duration % 1000) / 100)
            , seconds = parseInt((duration / 1000) % 60)
            , minutes = parseInt((duration / (1000 * 60)) % 60)
            , hours = parseInt((duration / (1000 * 60 * 60)) % 24);

        hours = (hours < 10) ? "0" + hours : hours;
        minutes = (minutes < 10) ? "0" + minutes : minutes;
        seconds = (seconds < 10) ? "0" + seconds : seconds;

        return hours + ":" + minutes + ":" + seconds + "." + milliseconds;
    };
});

Il suffit de l'ajouter à votre expression comme tel

{{milliseconds | milliSecondsToTimeCode}}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X