web-dev-qa-db-fra.com

Comment convertir les secondes en HH: mm: ss dans moment.js

Comment convertir des secondes en HH:mm:ss?

Au moment où j'utilise la fonction ci-dessous

render: function (data){
     return new Date(data*1000).toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");;
}

Cela fonctionne sur chrome mais dans firefox pendant 12 secondes je reçois 01:00:12 je voudrais utiliser moment.js pour la compatibilité entre navigateurs

J'ai essayé mais ça ne marche pas

render: function (data){
         return moment(data).format('HH:mm:ss');
}

Qu'est-ce que je fais mal?

EDIT

J'ai réussi à trouver une solution sans moment.js qui est comme suit

return (new Date(data * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];

Encore curieux de savoir comment je peux le faire dans moment.js

68
QGA

De this post J'essaierais ceci pour éviter les problèmes de saut

moment("2015-01-01").startOf('day')
    .seconds(s)
    .format('H:mm:ss');

Je n'ai pas lancé jsPerf, mais je pense que c'est plus rapide que de créer de nouveaux objets de date un million de fois

function pad(num) {
    return ("0"+num).slice(-2);
}
function hhmmss(secs) {
  var minutes = Math.floor(secs / 60);
  secs = secs%60;
  var hours = Math.floor(minutes/60)
  minutes = minutes%60;
  return `${pad(hours)}:${pad(minutes)}:${pad(secs)}`;
  // return pad(hours)+":"+pad(minutes)+":"+pad(secs); for old browsers
}
function pad(num) {
    return ("0"+num).slice(-2);
}
function hhmmss(secs) {
  var minutes = Math.floor(secs / 60);
  secs = secs%60;
  var hours = Math.floor(minutes/60)
  minutes = minutes%60;
  return `${pad(hours)}:${pad(minutes)}:${pad(secs)}`;
  // return pad(hours)+":"+pad(minutes)+":"+pad(secs); for old browsers
}

for (var i=60;i<=60*60*5;i++) {
 document.write(hhmmss(i)+'<br/>');
}


/* 
function show(s) {
  var d = new Date();
  var d1 = new Date(d.getTime()+s*1000);
  var  hms = hhmmss(s);
  return (s+"s = "+ hms + " - "+ Math.floor((d1-d)/1000)+"\n"+d.toString().split("GMT")[0]+"\n"+d1.toString().split("GMT")[0]);
}    
*/
56
mplungjan

Ceci est similaire à la réponse mplungjan référencée dans un autre message, mais plus concise:

const secs = 456;

const formatted = moment.utc(secs*1000).format('HH:mm:ss');

document.write(formatted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Il souffre des mêmes mises en garde, par exemple Si le nombre de secondes dépasse un jour (86400), vous n'obtiendrez pas ce que vous attendiez.

62
Sophie

Vous pouvez utiliser le plugin moment-duration-format :

var seconds = 3820;
var duration = moment.duration(seconds, 'seconds');
var formatted = duration.format("hh:mm:ss");
console.log(formatted); // 01:03:40
<!-- Moment.js library -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

<!-- moment-duration-format plugin -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>

Voir aussi ceci Violon

19
var seconds = 2000 ; // or "2000"
seconds = parseInt(seconds) //because moment js dont know to handle number in string format
var format =  Math.floor(moment.duration(seconds,'seconds').asHours()) + ':' + moment.duration(seconds,'seconds').minutes() + ':' + moment.duration(seconds,'seconds').seconds();
12