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!
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
// 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);
convertir la durée en ms puis en moment:
moment.utc(duration.as('milliseconds')).format('HH:mm:ss')
var diff = moment(end).unix() - moment(start).unix();
moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS");
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.
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.
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
Utilisez cette ligne de code:
moment.utc(moment.duration(4500, "seconds").asMilliseconds()).format("HH:mm:ss")
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'
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
si diff est un moment
var diff = moment(20111031) - moment(20111010);
var formated1 = moment(diff).format("hh:mm:ss");
console.log("format 1: "+formated1);
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
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>
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')
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");
}
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;
}
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
Cela fonctionne pour moi:
moment({minutes: 150}).format('HH:mm') // 01:30
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
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))