web-dev-qa-db-fra.com

Comment utiliser format () sur une durée de moment.js?

Est-il possible d'utiliser la méthode moment.jsformat sur des objets de durée? Je ne le trouve nulle part dans la documentation et cela ne semble pas être un attribut sur les objets de durée.

J'aimerais pouvoir faire quelque chose comme:

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

De plus, s'il y a d'autres bibliothèques pouvant facilement accueillir ce type de fonctionnalité, je serais intéressé par les recommandations.

Merci!

170
mvanveen

Nous cherchons à ajouter une certaine forme de formatage aux durées de moment.js. Voir https://github.com/timrwood/moment/issues/46

Quelques autres bibliothèques qui pourraient aider sont http://countdownjs.org/ et https://github.com/icambron/twix.js

51
timrwood
// 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);

regardez le JSFiddle

147
David Glass

convertir la durée en ms puis en moment:

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')
46
Sagiv Ofek

Utilisez ce plugin Format Moment Duration .

Exemple:

moment.duration(123, "minutes").format("h:mm");
39
kayz1
var diff = moment(end).unix() - moment(start).unix();
moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS");
14
Eric Saboia

Le meilleur scénario pour mon cas d'utilisation particulier était:

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

Ceci améliore la réponse de @ Wilson puisqu'il n'accède pas à la propriété interne privée _data.

10
TaeKwonJoe

J'utilise:

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

Et je reçois "09:30" en var str.

8
Wilson

Vous n'avez pas besoin de .format. Utilisez des durées comme celle-ci:

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

J'ai trouvé cette solution ici: https://github.com/moment/moment/issues/46

EDIT:

Et avec un rembourrage pour les secondes, les minutes et les heures:

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
6
ni-ko-o-kin

Utilisez cette ligne de code:

moment.utc(moment.duration(4500, "seconds").asMilliseconds()).format("HH:mm:ss")
5
NFpeter

Si vous souhaitez utiliser une autre bibliothèque javascript, numeral.js peut formater les secondes de la manière suivante (par exemple, la durée est de 1000 secondes):

var string = numeral(1000).format('00:00');
// '00:16:40'
5
GChorn

J'utilise la fonction de formatage classique dans les cas suivants:

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

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

Ceci est un hack car le diff de temps est traité comme une date de moment standard, une date de début de période, mais cela n'a pas d'importance pour notre objectif et vous n'avez besoin d'aucun plugin

5
Straps

si diff est un moment

var diff = moment(20111031) - moment(20111010);
var formated1 = moment(diff).format("hh:mm:ss");
console.log("format 1: "+formated1);
4
Kieran

Basé sur réponse de ni-ko-o-kin :

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
3
shaedrich

si vous utilisez angular ajoutez ceci à vos filtres:

.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 ': '')
    }
})

exemple d'utilisation

<div> {{diff | durationFormat}} </div>
3
Hai Alaluf

Si toutes les heures doivent être affichées (plus de 24 heures) et si "0" avant heures n'est pas nécessaire, le formatage peut être effectué avec une courte ligne de code:

Math.floor(duration.as('h')) + moment.utc(duration.as('ms')).format(':mm:ss')
3
o.v

Pour formater la durée du moment en chaîne

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
Dineshkani

Comment sur le javascript natif?

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
J. Allen
import * as moment from 'moment'
var sleep = require('sleep-promise');

(async function () {
    var t1 = new Date().getTime();
    await sleep(1000); 
    var t2 = new Date().getTime();
    var dur = moment.duration(t2-t1); 
    console.log(`${dur.hours()}h:${dur.minutes()}m:${dur.seconds()}s`);
})();

0h:0m:1s
0
Toolkit

Cela fonctionne pour moi:

moment({minutes: 150}).format('HH:mm') // 01:30
0
Natan Augusto

Je pense que cela devrait être la meilleure méthode pour s'y prendre.

var diff = moment(end).unix() - moment(start).unix();
moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS");

ou essayez ceci.

var momentInSeconds = moment.duration(n,'seconds')
console.log(("0" + Math.floor(momentInSeconds.asHours())).slice(-2) + ':' + ("0" + momentInSeconds.minutes()).slice(-2) + ':' + ("0" + momentInSeconds.seconds()).slice(-2))
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}`);

Impressions:

2 jours 14 h 00 min 00 s

0
davidhq

Ma solution qui n’implique aucune autre bibliothèque et qui fonctionne avec diff> 24h

var momentInSeconds = moment.duration(n,'seconds')
console.log(("0" + Math.floor(momentInSeconds.asHours())).slice(-2) + ':' + ("0" + momentInSeconds.minutes()).slice(-2) + ':' + ("0" + momentInSeconds.seconds()).slice(-2))
0
Lorenzo Tassone