如何使用Moment.js格式化持续时间?

时间:2014-02-10 10:31:58

标签: javascript momentjs

我希望在UTC格式化的两个日期中执行以下操作:

var start = "2014-01-13T06:00:00.0000000Z";
var end = "2014-01-13T14:16:04.0000000Z";

我想获得在这两次之间传递的确切时间跨度,例如

8h 16m

我尝试过使用以下内容:

var duration = moment(moment(end) - moment(start)).format('hh[h] mm[m]');

但这不适用于日子。此外,它不适用于几天,因为即使< 24小时过去,它们总是> = 1。

我也尝试过 twix.js 来获取长度,但是它的格式不支持创建上面指定的格式,或者我在文档中找不到这样做的方法。基本上我正在寻找twix.humanizeLength()完全版本。

Moment.js ' a.diff(b)仅提供总持续时间,它可以给出我以分钟,小时或天为单位的时间跨度长度,但不能使用余数计算。

我的当前解决方案是使用diff创建范围,然后使用modulo来计算余数,但这不是很优雅:

var days = moment(end).diff(start, 'days');
var hours = moment(end).diff(start, 'hours') % 24;
var minutes = moment(end).diff(start, 'minutes') % 60;

var duration = ((days > 0) ? days + 'd ' : '') + ((hours > 0) ? hours + 'h ' : '') + ((minutes > 0) ? minutes + 'm ' : ''); 

问题: moment.js twix.js 中,有没有更明智的方法可以做到这一点,或者我应该选择时间和发展我自己的moment.js插件?

2 个答案:

答案 0 :(得分:5)

您可以尝试使用持续时间,但我不确定这些是否具有您正在寻找的功能http://momentjs.com/docs/#/durations/

此外,您始终可以使用时刻的差异来获得以毫秒为单位的差异,然后根据您的需要对其进行格式化。它与你正在做的基本相同,但你只调用diff一次。

function convertMilliSecondsIntoLegibleString(milliSecondsIn) {

    var secsIn = milliSecondsIn / 1000;
    var milliSecs = milliSecondsIn % 1000;

    var hours = secsIn / 3600,
    remainder = secsIn % 3600,
    minutes = remainder / 60,
    seconds = remainder % 60;


    return ( hours + "h: "
            +  minutes + "m: "
            + seconds +"s: " + milliSecs + "ms");
}

答案 1 :(得分:4)

在moment.js中有一个格式化持续时间的插件:moment-duration-format

如果它不能满足你的需要,那么你应该扩展moment.duration.fn。如果你不支持很多语言环境,那应该很容易。

无论如何,我建议您阅读此feature request的主题。