Как использовать формат() на длительность time.js?

Можно ли использовать метод moment.js format для объектов продолжительности? Я не могу найти его нигде в документах, и он не считается атрибутом объектов продолжительности.

Я хотел бы сделать что-то вроде:

var diff = moment(end).unix() - moment(start).unix();
moment.duration(diff).format('hh:mm:ss')

Кроме того, если есть какие-либо другие библиотеки, которые могут легко разместить такую ​​функциональность, меня бы заинтересовали рекомендации.

Спасибо!

4b9b3361

Мы изучаем добавление какого-то форматирования к длительности в moment.js. См. https://github.com/timrwood/moment/issues/463

Несколько других библиотек, которые могут помочь, - http://countdownjs.org/ и https://github.com/icambron/twix.js

49
ответ дан 07 нояб. '12 в 20:03
источник
// set up
let start = moment("2018-05-16 12:00:00"); // some random moment in time (in ms)
let end = moment("2018-05-16 12:22:00"); // some random moment after start (in ms)
let diff = end.diff(start);

// execution
let f = moment.utc(diff).format("HH:mm:ss.SSS");
alert(f);

Посмотрите на JSFiddle

130
ответ дан 07 янв. '14 в 23:44
источник

конвертировать длительность в ms, а затем в момент:

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')
42
ответ дан 04 янв. '17 в 2:25
источник
var diff = moment(end).unix() - moment(start).unix();
moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS");
12
ответ дан 20 мая '15 в 3:46
источник

Я использую:

var duration = moment.duration("09:30");
var str = moment(duration._data).format("HH:mm");

И я получаю "09:30" в var str.

9
ответ дан 30 окт. '15 в 18:33
источник

Самый лучший сценарий для моего конкретного случая использования:

var duration = moment.duration("09:30"),
    formatted = moment.utc(duration.asMilliseconds()).format("HH:mm");

Это улучшает ответ @Wilson, поскольку он не имеет доступа к частным внутренним свойствам _data.

8
ответ дан 09 февр. '18 в 12:19
источник

Вам не нужно.формат. Используйте длительности как это:

const duration = moment.duration(83, 'seconds');
console.log(duration.minutes() + ':' +duration.seconds());
// output: 1:23

Я нашел это решение здесь: https://github.com/moment/moment/issues/463

РЕДАКТИРОВАТЬ:

И с отступами на секунды, минуты и часы:

const withPadding = (duration) => {
    if (duration.asDays() > 0) {
        return 'more than one day';
    } else {
        return [
            ('0' + duration.hours()).slice(-2),
            ('0' + duration.minutes()).slice(-2),
            ('0' + duration.seconds()).slice(-2),
        ].join(':')
    }
}

withPadding(moment.duration(83, 'seconds'))
// 00:01:23

withPadding(moment.duration(6048000, 'seconds'))
// more than one day
6
ответ дан 19 мая '17 в 16:53
источник

В этих случаях я использую функцию классического формата:

var diff = moment(end).unix() - moment(start).unix();

//use unix function instead of difference
moment.unix(diff).format('hh:mm:ss')

Это взломать, потому что разность времени рассматривается как стандартная дата момента, ранняя эпоха даты, но это не имеет значения для нашей цели, и вам не нужен плагин

5
ответ дан 18 нояб. '14 в 12:44
источник

Если вы хотите использовать другую библиотеку javascript, numeral.js может форматировать секунды следующим образом (пример - 1000 секунд):

var string = numeral(1000).format('00:00');
// '00:16:40'
5
ответ дан 22 авг. '14 в 3:21
источник

Чтобы форматировать длительность импульса в строку

var duration = moment.duration(86400000); //value in milliseconds
var hours = duration.hours();
var minutes = duration.minutes();
var seconds = duration.seconds();
var milliseconds = duration.milliseconds();

var date = moment().hours(hours).minutes(minutes).seconds(seconds).millisecond(milliseconds);
if (is12hr){
    return date.format("hh:mm:ss a");
}else{
    return date.format("HH:mm:ss");
}
3
ответ дан 30 мая '16 в 19:48
источник

если diff - момент

var diff = moment(20111031) - moment(20111010);
var formated1 = moment(diff).format("hh:mm:ss");
console.log("format 1: "+formated1);
3
ответ дан 07 нояб. '12 в 7:07
источник

если вы используете angular, добавьте это в свои фильтры:

.filter('durationFormat', function () {
    return function (value) {
        var days = Math.floor(value/86400000);
        value = value%86400000;
        var hours = Math.floor(value/3600000);
        value = value%3600000;
        var minutes = Math.floor(value/60000);
        value = value%60000;
        var seconds = Math.floor(value/1000);
        return (days? days + ' days ': '') + (hours? hours + ' hours ': '') + (minutes? minutes + ' minutes ': '') + (seconds? seconds + ' seconds ': '')
    }
})

Пример использования

<div> {{diff | durationFormat}} </div>
3
ответ дан 18 дек. '16 в 18:33
источник

Как насчет встроенного javascript?

var formatTime = function(integer) {
    if(integer < 10) {
        return "0" + integer; 
    } else {
        return integer;
    }
}

function getDuration(ms) {
    var s1 = Math.floor(ms/1000);
    var s2 = s1%60;
    var m1 = Math.floor(s1/60);
    var m2 = m1%60;
    var h1 = Math.floor(m1/60);
    var string = formatTime(h1) +":" + formatTime(m2) + ":" + formatTime(s2);
    return string;
}
1
ответ дан 02 мая '17 в 22:32
источник

Если все часы должны отображаться (более 24), и если "0" до часа не требуется, форматирование может выполняться с помощью короткой строки кода:

Math.floor(duration.as('h')) + moment.utc(duration.as('ms')).format(':mm:ss')
1
ответ дан 17 нояб. '17 в 18:21
источник

Основываясь на ответе ни-ко-о-кин:

meassurements = ["years", "months", "weeks", "days", "hours", "minutes", "seconds"];
withPadding = (duration) => {
    var step = null;
    return meassurements.map((m) => duration[m]()).filter((n,i,a) => {
        var nonEmpty = Boolean(n);
        if (nonEmpty || step || i >= a.length - 2) {
            step = true;
        }
        return step;
    }).map((n) => ('0' + n).slice(-2)).join(':')
}

duration1 = moment.duration(1, 'seconds');
duration2 = moment.duration(7200, 'seconds');
duration3 = moment.duration(604800, 'seconds');

withPadding(duration1); // 00:01
withPadding(duration2); // 02:00:00
withPadding(duration3); // 01:07:00:00:00
0
ответ дан 11 дек. '18 в 19:08
источник

Если вы используете Angular> 2, я сделал трубку, вдохновленную ответом @hai-alaluf.

import {Pipe, PipeTransform} from "@angular/core";

@Pipe({
  name: "duration",
})

export class DurationPipe implements PipeTransform {

  public transform(value: any, args?: any): any {

    // secs to ms
    value = value * 1000;
    const days = Math.floor(value / 86400000);
    value = value % 86400000;
    const hours = Math.floor(value / 3600000);
    value = value % 3600000;
    const minutes = Math.floor(value / 60000);
    value = value % 60000;
    const seconds = Math.floor(value / 1000);
    return (days ? days + " days " : "") +
      (hours ? hours + " hours " : "") +
      (minutes ? minutes + " minutes " : "") +
      (seconds ? seconds + " seconds " : "") +
      (!days && !hours && !minutes && !seconds ? 0 : "");
  }
}
-1
ответ дан 30 нояб. '18 в 18:56
источник