Javascript показывают миллисекунды как дни: часы: минуты без секунд - PullRequest
14 голосов
/ 16 декабря 2011

Я рассчитываю разницу между двумя датами, для которых доступно много разных примеров. Время возвращается в миллисекундах, поэтому мне нужно преобразовать его во что-то более полезное.

Большинство примеров приведены для дней: часов: минут: секунд или часов: минут, но мне нужно дней: часов: минут , поэтому секунды должны быть округлены до минут.

Метод, который я сейчас использую, близок, но показывает 3 дня как 2.23.60, когда он должен показывать 3.00.00, так что что-то не совсем правильно. Поскольку я только что взял текущий код из примера в Интернете, я открыт для предложений относительно других способов сделать это.

Я получаю время в миллисекундах, вычитая дату начала из даты окончания следующим образом: -

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

Мне нужно взять переменную ms и превратить ее в days.hours: minutes.

Ответы [ 9 ]

22 голосов
/ 16 декабря 2011

Как то так?

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 ) );
13 голосов
/ 07 октября 2014

Звучит как работа для 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

Существует множество других способов форматирования длительностей в MomentJS. Документы очень полны.

9 голосов
/ 21 ноября 2014

Не знаю, почему, но другие не сработали для меня, так вот мой

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));
3 голосов
/ 16 декабря 2011

Вот, пожалуйста:

http://jsfiddle.net/uNnfH/1

Или, если вы не хотите играть с запущенным примером, тогда:

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);
}
2 голосов
/ 16 декабря 2011

Не знаю, сколько ответов вам нужно, но вот еще один - просто еще один из нескольких уже полученных ответов:

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

Будьте осторожны с такими вычислениями, хотя периоды, пересекающие границы перехода на летнее время, приведутпроблемы.Всегда лучше работать в UTC и конвертировать в местное время для презентации.

1 голос
/ 16 декабря 2011

«Возвращаемое время указывается в миллисекундах, поэтому мне нужно преобразовать его во что-то более полезное».

Возвращаете ли вы время с сервера или это чистый JavaScript?

Какой-то код действительно поможет. «Что-то полезное» выглядит нечетко.

Вот пример, я думаю, это то, о чем вы говорите.

<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!
0 голосов
/ 23 июня 2018

Адаптировано с gist.github.com / Remio / 1563878 . Мне немного яснее, что происходит.

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 голосов
/ 19 февраля 2016

С помощью moment.js попробуйте это:

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

Если вы хотите показать часы, вы должны иметь обходной путь:

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

Этот обходной путь был представлен в этом выпуске .

0 голосов
/ 16 декабря 2011

Без кода трудно точно сказать, какая у вас ошибка, но я подозреваю, что вы делаете именно так, как вы сказали: округление.Если вам не подходит округление вниз, вот как округлить до ближайшего:

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

, а затем продолжить вычисление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...