如何在moment.js持续时间内使用format()?

mva*_*een 182 javascript momentjs

有什么办法可以在持续时间对象上使用moment.js format方法吗?我在文档中的任何地方都找不到它,并且它看起来不是持续时间对象的属性.

我希望能够做到这样的事情:

var diff = moment(end).unix() - moment(start).unix();
moment.duration(diff).format('hh:mm:ss')
Run Code Online (Sandbox Code Playgroud)

此外,如果有任何其他库可以轻松容纳这种功能,我会对reccomendations感兴趣.

谢谢!

Dav*_*ass 150

// 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);
Run Code Online (Sandbox Code Playgroud)

看看JSFiddle

  • 以mm:ss显示10万亿毫秒毫无意义 (48认同)
  • 这不会超过24小时(即如果我想显示117小时).否则很棒的方案! (24认同)
  • 好方法.虽然如果我想显示天数也不行:'DDD HH:mm:ss.SSS`(其中`DDD`是一年中的某一天)当我想要'0`时显示`1`.有什么快速解决方法吗? (3认同)

tim*_*ood 52

我们正在研究在moment.js中为持续时间添加某种格式.请参阅https://github.com/timrwood/moment/issues/463

其他一些可能有用的库是http://countdownjs.org/https://github.com/icambron/twix.js

  • 为什么它不能与库中其他地方使用的另一种格式相同?这是精神错乱.5年了,还没有完成?真?! (18认同)
  • 六年后的任何更新?或者这仍然不知道怎么办? (5认同)
  • 我也期待格式化持续时间.看看countdownjs现在,但twix似乎只做"智能"格式化,没有太多的自定义. (4认同)
  • 我正在投票,因为在这个答案中链接的github问题只是一个永无止境的流意见,愿望和咆哮导致无处可去,问题仍然在4年后开放,没有任何用户 (4认同)
  • 七年后,对此有任何更新吗?还是以某种方式还没有完成? (4认同)
  • Countdown.js很棒,而且作者非常乐于助人(由于我提出了一些建议,他在同一天发布了**版本**)! (3认同)
  • 虽然twix很难进行智能格式化,但它有很多格式化选项,直到所涉及的标记:https://github.com/icambron/twix.js/wiki/Formatting.免责声明:我是twix的作者. (2认同)

Sag*_*fek 52

将持续时间转换为ms然后转换为时刻:

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')
Run Code Online (Sandbox Code Playgroud)

  • 因此,如果您的持续时间超过24小时,这将不起作用.24h正被重置为0h (8认同)
  • @ S.Robijns是一个有用的观察,但只是要向他人强调-这是* .format('HH:mm:ss')`的预期行为。[查看文档](https://momentjs.com/docs/#/displaying/format/) (2认同)

kay*_*yz1 41

使用此插件时刻持续时间格式.

例:

moment.duration(123, "minutes").format("h:mm");
Run Code Online (Sandbox Code Playgroud)

  • @ppumkin我知道这是旧的,但如果你指定`{trim:false}`它将停止这种行为. (9认同)
  • 这就是我更喜欢使用的方法:假设您有持续时间,例如const duration = moment.duration(value,'seconds');`我可以使用以下格式进行格式化:`moment.utc(duration.as('milliseconds')) ).format('HH:mm:ss')。toString();` (2认同)
  • @EvgenyBobkin,如果你的持续时间超过一天,那将不起作用,但图书馆会处理它 (2认同)

Eri*_*oia 14

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

  • 无用。像这个问题的大多数其他答案一样,返回持续时间的部分小时数而不是总小时数。例如返回 12:00 持续时间 moment.duration({days: 2, hours: 12}) (3认同)

Tae*_*Joe 10

我的特定用例的最佳方案是:

var duration = moment.duration("09:30"),
    formatted = moment.utc(duration.asMilliseconds()).format("HH:mm");
Run Code Online (Sandbox Code Playgroud)

这改进了@Wilson的答案,因为它不访问私有内部属性_data.


NFp*_*ter 9

使用以下代码行:

moment.utc(moment.duration(4500, "seconds").asMilliseconds()).format("HH:mm:ss")
Run Code Online (Sandbox Code Playgroud)

  • 如果持续时间大于86400英寸(即24小时),则将无法使用。 (2认同)

小智 8

我用:

var duration = moment.duration("09:30");
var str = moment(duration._data).format("HH:mm");
Run Code Online (Sandbox Code Playgroud)

我在var str得到了"09:30".

  • 避免这种解决方案,`_data`是一个内部属性,可能会在没有警告的情况下更改. (4认同)
  • @AnnaR`h`在1-12的范围内,所以这是相当可以预料的.使用`H`代替[docs - 小时代币](https://momentjs.com/docs/#hour-minute-second-millisecond-and-offset-tokens) (2认同)

ni-*_*kin 8

你不需要.format.使用这样的持续时间:

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

我在这里找到了这个解决方案:https://github.com/moment/moment/issues/463

编辑:

填充秒,分钟和小时:

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
Run Code Online (Sandbox Code Playgroud)

  • 如果duration.seconds()小于10,这将不包括前导零,但是...... (2认同)

小智 8

我需要这样做是为了工作,因为需要以这种格式显示小时数。起初我试过这个。

moment.utc(totalMilliseconds).format("HH:mm:ss")
Run Code Online (Sandbox Code Playgroud)

然而,任何超过 24 小时和小时重置为 0。但分钟和秒是准确的。所以我只在分钟和秒内使用了那部分。

var minutesSeconds = moment.utc(totalMilliseconds).format("mm:ss")
Run Code Online (Sandbox Code Playgroud)

现在我只需要总小时数。

var hours = moment.duration(totalMilliseconds).asHours().toFixed()
Run Code Online (Sandbox Code Playgroud)

为了获得我们都想要的格式,我们只需将它粘合在一起。

var formatted = hours + ":" + minutesSeconds
Run Code Online (Sandbox Code Playgroud)

如果totalMilliseconds894600000这将返回249:30:00

希望有所帮助。在评论中留下任何问题。;)


Kie*_*ran 5

如果差异是片刻

var diff = moment(20111031) - moment(20111010);
var formated1 = moment(diff).format("hh:mm:ss");
console.log("format 1: "+formated1);
Run Code Online (Sandbox Code Playgroud)

  • 每个人都生活在一个时区。moment(0) 是否总是在每个时区注册为 12:00 AM? (3认同)

GCh*_*orn 5

如果您愿意使用不同的javascript库,则numbers.js可以格式化秒,如下所示(示例为1000秒):

var string = numeral(1000).format('00:00');
// '00:16:40'
Run Code Online (Sandbox Code Playgroud)


小智 5

在这些情况下我使用经典格式函数:

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

//use unix function instead of difference
moment.unix(diff).format('hh:mm:ss')
Run Code Online (Sandbox Code Playgroud)

这是一个黑客,因为时间差异被视为标准时刻日期,一个早期的纪元日期时间,但它与我们的目标无关,你不需要任何插件


o.v*_*o.v 5

如果必须显示所有小时数(超过 24 小时)并且不需要小时前的“0”,则可以使用一小行代码完成格式化:

Math.floor(duration.as('h')) + moment.utc(duration.as('ms')).format(':mm:ss')
Run Code Online (Sandbox Code Playgroud)


sha*_*ich 5

基于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
Run Code Online (Sandbox Code Playgroud)

  • 问题是在大多数情况下,您的解决方案并不理想,因为它包含太多前导零。谁想要返回“00:00:00:00:01”?我的解决方案是“可扩展的”,并根据需要添加尽可能多的前导零。 (2认同)

Dom*_*olt 5

简短版本(单行):

moment.duration(durationInMs).asHours()|0||"00" + ":" + moment.utc(durationInMs).format("mm:ss")
Run Code Online (Sandbox Code Playgroud)

扩大的视野:

export const formatDuration = (durationInMs) => {
    const hours = Math.floor(moment.duration(durationInMs).asHours()) || "00"
    return hours + ":" + moment.utc(durationInMs).format("mm:ss")
}
Run Code Online (Sandbox Code Playgroud)

案例示例:

案例示例