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

10

我想要做以下事情,给定两个以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创建范围,然后使用模运算计算余数,但这并不是很优雅:

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.jstwix.js中有没有更聪明的方法来做到这一点?还是我应该花时间开发自己的moment.js插件?

2个回答

8

您可以尝试使用Durations,但我不确定它们是否具备您需要的功能 http://momentjs.com/docs/#/durations/

此外,您可以始终使用moment的diff方法获取毫秒差,并将其格式化为所需格式。这基本上与您正在做的相同,但只调用一次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");
}

4

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

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

无论如何,我建议阅读这个功能请求的线程。


我会关注功能请求的进展。目前,那个插件已经满足了我的需求。 - ane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接