【问题标题】:How can I format time durations exactly using Moment.js?如何使用 Moment.js 准确格式化持续时间?
【发布时间】:2014-02-10 10:31:57
【问题描述】:

给定两个 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]');

但这不适用于天数。此外,它不适用于天,因为即使经过 =1。

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

Moment.jsa.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 插件吗?

【问题讨论】:

    标签: javascript momentjs


    【解决方案1】:

    您可以尝试使用持续时间,但我不确定它们是否具有您正在寻找的功能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");
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我会看看功能请求会发生什么。目前,该插件可以满足我的需求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多