web-dev-qa-db-fra.com

Javascript affiche les millisecondes en jours: heures: minutes sans secondes

Je calcule la différence entre 2 dates pour lesquelles de nombreux exemples différents sont disponibles. Le temps renvoyé est en millisecondes, donc je dois le convertir en quelque chose de plus utile. 

La plupart des exemples concernent les jours: heures: minutes: secondes ou heures: minutes, mais j'ai besoin de jours: heures: minutes donc les secondes doivent être arrondies dans les minutes.

La méthode que j'utilise actuellement se rapproche mais indique 3 jours comme 2.23.60, alors qu'il devrait afficher 3.00.00, ce qui ne va pas. Comme je viens de prendre le code actuel d'un exemple sur le Web, je suis ouvert aux suggestions pour d'autres façons de le faire.

J'obtiens le temps en millisecondes en soustrayant une date de début d'une date de fin comme suit: -

date1 = new Date(startDateTime);
date2 = new Date(endDateTime);
ms = Math.abs(date1 - date2)

J'ai essentiellement besoin de prendre la variable ms et de me transformer en jours.heures: minutes.

14
Mitch

Quelque chose comme ça?

function dhm(t){
    var cd = 24 * 60 * 60 * 1000,
        ch = 60 * 60 * 1000,
        d = Math.floor(t / cd),
        h = Math.floor( (t - d * cd) / ch),
        m = Math.round( (t - d * cd - h * ch) / 60000),
        pad = function(n){ return n < 10 ? '0' + n : n; };
  if( m === 60 ){
    h++;
    m = 0;
  }
  if( h === 24 ){
    d++;
    h = 0;
  }
  return [d, pad(h), pad(m)].join(':');
}

console.log( dhm( 3 * 24 * 60 * 60 * 1000 ) );
22
Mic

Cela ressemble à un travail pour Moment.js .

var diff = new moment.duration(ms);
diff.asDays();     // # of days in the duration
diff.asHours();    // # of hours in the duration
diff.asMinutes();  // # of minutes in the duration

Il existe une multitude d'autres façons de formater les durées dans MomentJS. Les docs sont très complets.

14
Brian Kelly

Je ne sais pas pourquoi mais les autres n'ont pas travaillé pour moi alors voici le mien 

function dhm(ms){
    days = Math.floor(ms / (24*60*60*1000));
    daysms=ms % (24*60*60*1000);
    hours = Math.floor((daysms)/(60*60*1000));
    hoursms=ms % (60*60*1000);
    minutes = Math.floor((hoursms)/(60*1000));
    minutesms=ms % (60*1000);
    sec = Math.floor((minutesms)/(1000));
    return days+":"+hours+":"+minutes+":"+sec;
}

alert(dhm(500000));
8
Laurent Duvergé

Voici:

http://jsfiddle.net/uNnfH/1

Ou si vous ne voulez pas jouer avec un exemple en cours, alors:

window.minutesPerDay = 60 * 24;

function pad(number) {
    var result = "" + number;
    if (result.length < 2) {
        result = "0" + result;
    }

    return result;
}

function millisToDaysHoursMinutes(millis) {
    var seconds = millis / 1000;
    var totalMinutes = seconds / 60;

    var days = totalMinutes / minutesPerDay;
    totalMinutes -= minutesPerDay * days;
    var hours = totalMinutes / 60;
    totalMinutes -= hours * 60; 

    return days + "." + pad(hours) + "." + pad(totalMinutes);
}
3
aroth

Vous ne savez pas combien de réponses vous avez besoin, mais voici une autre - prenez simplement une autre réponse à quelques réponses déjà données:

function msToDHM(v) {
  var days = v / 8.64e7 | 0;
  var hrs  = (v % 8.64e7)/ 3.6e6 | 0;
  var mins = Math.round((v % 3.6e6) / 6e4);

  return days + ':' + z(hrs) + ':' + z(mins);

  function z(n){return (n<10?'0':'')+n;}
}

Faites attention avec de tels calculs, cependant, les périodes traversant les frontières de l’heure d’été créeront des problèmes. Il est toujours préférable de travailler en UTC et de convertir en heure locale pour la présentation.

2
RobG

"Le temps renvoyé est en millisecondes, je dois donc le convertir en quelque chose de plus utile." 

Recevez-vous l'heure d'un serveur ou s'agit-il de javascript pur?

Un code aiderait vraiment. "Quelque chose d'utile" est un peu vague.

Voici un exemple, je pense que c'est ce dont vous parlez.

<script type="text/javascript">

//Set the two dates
var millennium =new Date(2000, 0, 1) //Month is 0-11 in JavaScript
today=new Date()
//Get 1 day in milliseconds
var one_day=1000*60*60*24

//Calculate difference btw the two dates, and convert to days
document.write(Math.ceil((today.getTime()-millennium.getTime())/(one_day))+
" days has gone by since the millennium!")

</script>
4367 days has gone by since the millennium!
1
Travis J

Sans code, il est difficile de dire quelle erreur vous avez, mais je suppose que vous faites exactement ce que vous avez dit: arrondir. Si arrondir ne vous convient pas, voici comment arrondir au plus proche:

var time = date.getTime();
if (time % 60000 >= 30000) time += 60000;

puis continuez avec le calcul.

0
Amadan

Avec moment.js, essayez ceci:

function getFormattedMs(ms) {
  var duration = moment.duration(ms);
  return moment.utc(duration.asMilliseconds()).format("mm:ss");
}

Lorsque vous souhaitez afficher les heures, vous devez appliquer une solution de contournement:

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

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

0
Robin Wieruch

Adapté de Gist.github.com/remino/1563878 . Cela me semble un peu plus clair ce qui se passe.

function convertMS(ms) {
  var d, h, m, s;
  s = Math.floor(ms / 1000);
  m = Math.floor(s / 60);
  s = s % 60;
  h = Math.floor(m / 60);
  m = m % 60;
  d = Math.floor(h / 24);
  h = h % 24;

  var pad = function (n) { return n < 10 ? '0' + n : n; };

  var result = d + '.' + pad(h) + ':' + pad(m);
  return result;
};
0
Michael Tranchida