Как я могу использовать format () для момента moment.js?

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

Я хотел бы иметь возможность сделать что-то вроде:

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

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

Спасибо!

 Paul Williams27 апр. 2016 г., 19:05
moment.utc (duration.asMilliseconds ()). Формат (»чч: мм: сс); - Длительность - это вектор. Поместив хвост в начало координат, вы можете использовать форматирование даты, чтобы получить чч: мм: сс.

Ответы на вопрос(18)

Формат продолжительности момента.

Пример:

moment.duration(123, "minutes").format("h:mm");
 emptywalls31 июл. 2016 г., 11:05
@CarlosMartinez, который сделал свое дело: D
 kayz109 июн. 2015 г., 21:34
Пытаться "чч: мм: сс».
 Evgeny Bobkin07 нояб. 2017 г., 07:57
Это то, что я предпочитаю использовать: Предположим, у вас есть продолжительность, какconst duration = moment.duration(value, 'seconds'); чем я могу быть отформатирован с помощью:moment.utc(duration.as('milliseconds')).format('HH:mm:ss').toString();
 Carlos Martinez17 мар. 2016 г., 19:44
@ppumkin Я знаю, что это старый, но если вы укажете{ trim: false } это остановит это поведение.
 reggaeguitar03 окт. 2018 г., 20:20
@EvgenyBobkin, который выигралесли ваша продолжительность больше суток, библиотека справится с этим, хотя
 Piotr Kula23 апр. 2015 г., 23:40
Это форматирование нене работает должным образом, сторона продолжительности хорошо, но если я укажуhh:mm:mm и только 10 секунд это показывает10 вместо00:00:10 (даже при включенной силовой длине) Если это не форматирование ... тогда это должно называться как-то иначе, форматы должны быть стандартизированы.

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')
 S. Robijns18 окт. 2018 г., 14:38
Так что это не работает, если ваша продолжительность больше 24 часов. 24 часа сбрасывается на 0 часов
 davnicwil16 нояб. 2018 г., 23:27
@ S.Robijns полезное замечание, но просто подчеркнуть для других - этоявляется ожидаемое поведение..format('HH:mm:ss')Посмотреть документы

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

var string = numeral(1000).format('00:00');
// '00:16:40'
 Piotr Kula23 апр. 2015 г., 23:48
безусловно, путь. как и ожидалось.

Я использую:

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

И я получаю9:30" в вар ул.

 vanthome16 дек. 2015 г., 22:54
Большой! Это просто работает ... как же ты это придумал :)
 Druska02 мар. 2016 г., 16:14
Избегайте этого решения,_data является внутренним свойством и может изменяться без предупреждения.
 Anna R21 апр. 2016 г., 13:35
К сожалению, это не будет работать всегда, как ожидалось:moment(moment.duration(1200000)._data).format('hh:mm:ss') вернется 12:20 вместо 00:20
 Gil Epshtain15 мая 2019 г., 15:48
Это неправильно не только из-за того, что вы игнорируете ДНИ, поэтому 1 день и 1 час будут отображаться как 01:00. Кроме того, вы полностью игнорируете часовые пояса, лучшее решение, нотакже нетт полный один будетmoment.utc(...).format("HH:mm");
 barbsan13 февр. 2017 г., 11:08
@AnnaRh находится в диапазоне 1-12, так чтодовольно ожидаемо. использованиеH вместодокументы - часовые жетоны

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

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

 Kamlesh20 февр. 2018 г., 07:54
Спасибо @TaeKwonJoe

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

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

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

// 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

 Andrew Mao05 февр. 2014 г., 19:26
да, этов основном то, что я сделал ...
 eon30 мар. 2016 г., 21:19
Спасибо за это! Мне тоже нужно было несколько литералов, и это прекрасно работает:moment.utc(diff).format('d[d] h[h] m[m]') выводить1d 8h 27m "
 Calvin13 февр. 2016 г., 16:09
Хороший подход. Я использую это как формат (mm: ss.SS).
 David Glass26 февр. 2018 г., 20:45
@RavenHursT Сделано в соответствии с просьбой. См редактировать
 Vinay28 дек. 2015 г., 11:04
@Phil вы можете использовать "D" или же "DD» если ты'Я хотел бы показать дни.
 Phil13 июл. 2015 г., 19:56
это нене работает в течение последних 24 часов (т. е. если я хочу отобразить 117 часов). в противном случае отличное решение!
 Phil04 янв. 2016 г., 04:14
@Vinay - разница в том, что если вы хотите получить 0 в начале. увидетьmomentjs.com/docs/#/displaying/format
 Andrew Mao04 февр. 2014 г., 08:12
Хороший подход. Хотя это нене работает, если я тоже хочу отображать дни:DDD HH:mm:ss.SSS (гдеDDD день года) отображает1 когда я хочу0, Любое быстрое решение для этого?
 reggaeguitar02 окт. 2018 г., 01:00
Пришлось добавить.asMilliseconds ()» как @TaeKwanJoe 'Ответ s, чтобы получить это, чтобы возвратить что-либо кроме 0
 RavenHursT29 янв. 2018 г., 19:36
Этот ответ объясняет, как отображать отформатированный Момент MomentJS, а не ДЛИТЕЛЬНОСТЬ, как указано в вопросе.
 Pier-Luc Gendreau19 июн. 2014 г., 06:10
Это неНе имеет смысла отображать 10 квадриллионов миллисекунд в виде мм: сс
 RavenHursT26 февр. 2018 г., 16:23
@DavidGlass Я вижу, что тыговорите сейчас. Может быть, сделать это немного яснее с чем-то вроде?var duration = 54321 - 12345
 David Glass05 февр. 2014 г., 19:11
Нет простого пути. я сделал этоjsfiddle.net/fhdd8/14 что, вероятно, ты и сделал, но я неЯ думаю, у момента есть все, что делает это из коробки
 David Glass23 февр. 2018 г., 20:30
@RavenHursT Не уверен, что я понимаю, что тыповторяю ... объявление var ms должно быть продолжением (подставляя разность двух моментов)

0' перед часами нет необходимости, тогда форматирование можно выполнить с помощью короткой строки кода:

Math.floor(duration.as('h')) + moment.utc(duration.as('ms')).format(':mm:ss')
const duration = moment.duration(62, 'hours');
const n = 24 * 60 * 60 * 1000;
const days = Math.floor(duration / n);
const str = moment.utc(duration % n).format('H [h] mm [min] ss [s]');
console.log(`${days > 0 ? `${days} ${days == 1 ? 'day' : 'days'} ` : ''}${str}`);

2 дня 14 ч 00 мин 00 с

Как насчет нативного 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;
}

если разница это момент

var diff = moment(20111031) - moment(20111010);
var formated1 = moment(diff).format("hh:mm:ss");
console.log("format 1: "+formated1);
 Keith12 мар. 2013 г., 18:37
Это неt кажется надежным перед лицом часовых поясов и тому подобного. Вы используете это в производстве?
 Kieran13 мар. 2013 г., 03:31
вопрос не упоминает о часовых поясах.
 Andrew Mao04 февр. 2014 г., 07:23
Я думаю, что версия UTC работает.
 Keith13 мар. 2013 г., 14:01
Все живут в часовом поясе. Всегда ли момент (0) регистрируется как 12:00 в каждом часовом поясе?
 kumar_harsh30 мая 2013 г., 22:56
вторая строка создаст момент с начала времени (1970). Это победилот делать
 Keith14 мар. 2013 г., 12:56
Я просто спрашиваю, работает ли код в вашем ответе или нет, потому что я скептически отношусь. Я'Мы написали много кода, который работает с датами, на многих языках программирования. Исходя из моего опыта, кажется, что ваш код будет работать только в определенных часовых поясах - но я'спрашиваю, потому что, возможно, естьчто-то я неНе знаю, как Javascript представляет даты около эпохи Unix.
 ken16 июл. 2013 г., 00:02
Как указывает @Harsh,moment() Конструктор использует временную метку Unix, и поэтому все, что вы передадите ей, будет считаться определенным расстоянием от 01.01.1970.

Для форматирования длительности момента в строку

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

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 : "");
  }
}

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 'at least 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'))
// at least one day
 shaedrich11 дек. 2018 г., 17:09
Как насчетэто решение?
 ni-ko-o-kin11 дек. 2018 г., 13:36
@shaedrich Я снова обновил свой ответ, включив часы; если вам нужны дни, недели, а также вы можете добавить их в массив
 Stephen Paul18 апр. 2019 г., 11:02
if (duration.asDays() > 0) { return 'at least one day'; - Я правильно читаю?
 shaedrich24 нояб. 2018 г., 23:53
Что будет, если у вас будет больше секунд, чем час? Это нормально, что у тебя тогда больше 60 секунд?
 ni-ko-o-kin11 дек. 2018 г., 12:11
@shaedrich и carpiediem Я обновил свой ответ
 shaedrich11 дек. 2018 г., 12:40
Ведущие нули работают, ноduration = moment.duration(7200, 'seconds'); withPadding(duration); скажет "00:00" .
 carpiediem22 сент. 2017 г., 09:26
Это победилоt включает ведущие нули, если duration.seconds () меньше 10, хотя ...
 shaedrich11 дек. 2018 г., 16:49
@ ni-ko-o-kin Моя проблема с решением состоит в том, что я мог бы ввести1 или же604800, Оба должны иметь правильные результаты, но не ведущие "00:».

.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>
 riketscience08 мар. 2018 г., 13:35
Очень мило на самом деле. Я искалкрасивый формат как это. Спасибо!
Решение Вопроса

t.js. Увидетьhttps://github.com/timrwood/moment/issues/463

Пара других библиотек, которые могут помочьhttp://countdownjs.org/ а такжеhttps://github.com/icambron/twix.jsI»

 kristopolous01 мар. 2017 г., 09:34
Почему можнобыть ли он идентичным другому .format, используемому в других местах библиотеки? Это безумие. 5 лет и все вышловсе еще не сделано? действительно?!
 mpen23 янв. 2013 г., 06:21
С нетерпением жду форматирования продолжительности. Взгляните на countdownjs сейчас, но твикс только кажетсяумный" форматирование, не так много настроек.
 user2435928 мар. 2013 г., 06:00
Хотя twix усердно работает для интеллектуального форматирования, у него есть много вариантов форматирования, вплоть до задействованных токенов:github.com/icambron/twix.js/wiki/Formatting, Отказ от ответственности: ям автор твикса.
 bmaggi30 дек. 2016 г., 16:36
Я отказываюсь от голосования, потому что проблема github, связанная в этом ответе, - это нескончаемый поток мнений, желаний и напыщенности, которые никуда не ведут, проблема все еще открыта через 4 года, ничего полезного
 Lari14 июн. 2017 г., 19:01
понизить это тоже
 Toolkit02 мая 2019 г., 06:35
Любое обновление по этому вопросу, семь лет спустя? Или это еще как-то не сделано?
 Ohad Schneider15 февр. 2015 г., 09:02
Countdown.js отлично, и автор очень полезен (он только что выпустил2 версии в тот же день в связи с некоторыми предложениями я сделал)!
 Nic Hartley23 сент. 2018 г., 05:41
Любое обновление по этому, шесть лет спустя? Или это еще как-то не сделано?
 RavenHursT27 февр. 2018 г., 00:20
Вниз голосование, а также. Лучший вариант, ИМХО здесь:stackoverflow.com/a/25386127/282250

На основеп-ко-о-кинответ:

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
 ni-ko-o-kin12 дек. 2018 г., 14:51
Я обновил свой ответ снова, чтобы иметь дело больше чем с одним днем. Это прекрасно работает для моего случая использования.
 shaedrich12 дек. 2018 г., 16:40
Проблема в том, что в большинстве случаев ваше решение не является идеальным, поскольку оно содержит слишком много начальных нулей. Кто хочет иметь00: 00: 00: 00: 01" вернулся? Мое решение "масштабируемый» и добавляет столько начальных нулей, сколько необходимо.
 ni-ko-o-kin12 дек. 2018 г., 14:43
Я нене думаю, что этоочень читабельно Какую проблему вы хотите решить здесь? Какой у вас вариант использования?
var diff = moment(end).unix() - moment(start).unix();
moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS");
 kristopolous25 окт. 2018 г., 10:36
moment.duration (diff) .asMilliseconds () является чрезмерным. Вы можете просто использовать diff, этос уже в миллисекундах.
 dmmd17 сент. 2015 г., 20:54
Без объяснения или нет, это то, что сделал для меня. Спасибо :)
 coffekid18 мая 2017 г., 03:16
Пояснения не нужны. Документ Moment.js может показать, как это решение было достигнуто.
 Neutrino12 июл. 2017 г., 16:17
Бесполезный. Как и большинство других ответов на этот вопрос, возвращаются неполные часы продолжительностью, а не полные часы. Например. возвращает 12:00 для продолжительности moment.duration ({дней: 2, часов: 12})
 Nathan Tuggy20 мая 2015 г., 03:50
Как правило, ответы гораздо полезнее, если они включают в себя объяснение того, для чего предназначен код, и почему это решает проблему, не представляя других. (Это сообщение было помечено по крайней мере одним пользователем, вероятно потому, что они думали, что ответ без объяснения причин следует удалить.)

Ваш ответ на вопрос