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

271

我是否能够在持续时间对象上使用 moment.jsformat 方法?我在文档中没有找到它的任何信息,并且似乎也不是持续时间对象的属性。

我想要做这样的事情:

var diff = moment(end).unix() - moment(start).unix();
moment.duration(diff).format('hh:mm:ss')

另外,如果有其他能够轻松实现此类功能的库,我会对推荐很感兴趣。

谢谢!


9
moment.utc(duration.asMilliseconds()).format('hh:mm:ss'); “duration”是一个向量。将其尾部放在原点上,您可以使用日期格式化来得到“hh:mm:ss”。 - Paul Williams
1
moment.utc(moment.duration(23, 'seconds').asMilliseconds()).format('hh:mm:ss') => "12:00:23" 不太好用 - goldenratio
2
啊,我找到问题了,在我的先前示例中,HH:mm:ss会给出00:00:23。所以只是小时部分的大小写错误。 - goldenratio
1
对于那些想以可读的方式显示持续时间的人,请使用:moment.duration(diff_ms).humanize(); - Rafe
31个回答

2

只使用 moment.js,没有其他插件

moment().startOf('day').seconds(duration).format('HH:mm:ss')

非常聪明!谢谢! - nelson6e65

2

moment.duration(x).format()已被弃用。 您可以使用moment.utc(4366589).format("HH:mm:ss")来获得所需的响应。

console.log(moment.utc(4366589).format("HH:mm:ss"))
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


2

使用 moment-duration-format 库。

客户端框架(例如:React)

import moment from 'moment';
import momentDurationFormatSetup from 'moment-duration-format';
momentDurationFormatSetup(moment);

const breakLengthInMinutes = moment.duration(breakLengthInSeconds, 's').format('m');

服务器 (node.js)

const moment = require("moment-timezone");
const momentDurationFormatSetup = require("moment-duration-format");

momentDurationFormatSetup(moment);

const breakLengthInMinutes = moment.duration(breakLengthInSeconds, 's').format('m');

2
原生JavaScript怎么样?
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;
}

1

现在(如果曾经有过的话),不再需要将持续时间转换为UTC来解决此问题。这就像将十进制“1”转换为二进制,然后说由于输出的“1”看起来像是十进制,我们假定这是任何进一步操作的十进制值而没有问题。

使用moment-duration-format,请注意,使用{ trim: false }可以防止修剪:

moment.duration(1000000, "seconds").format("hh:mm:ss", { trim: false })
> "277:46:40"
moment.duration(0, "seconds").format("hh:mm:ss", { trim: false })
> "00:00:00"

让我们将其与不推荐的使用UTC的方法进行比较:

moment.utc(moment.duration(1000000, "seconds").asMilliseconds()).format('HH:mm:ss')
> "13:46:40"

1
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}`);

打印:

2天14小时00分00秒


0
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

0

这可以用于获取前两个字符作为小时,后两个字符作为分钟。同样的逻辑也可以应用于秒。

/**
     * PT1H30M -> 0130
     * @param {ISO String} isoString
     * @return {string} absolute 4 digit number HH:mm
     */

    const parseIsoToAbsolute = (isoString) => {
    
      const durations = moment.duration(isoString).as('seconds');
      const momentInSeconds = moment.duration(durations, 'seconds');
    
      let hours = momentInSeconds.asHours().toString().length < 2
        ? momentInSeconds.asHours().toString().padStart(2, '0') : momentInSeconds.asHours().toString();
        
      if (!Number.isInteger(Number(hours))) hours = '0'+ Math.floor(hours);
    
      const minutes = momentInSeconds.minutes().toString().length < 2
        ? momentInSeconds.minutes().toString().padEnd(2, '0') : momentInSeconds.minutes().toString();
    
      const absolute = hours + minutes;
      return absolute;
    };
    
    console.log(parseIsoToAbsolute('PT1H30M'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>


如果您将代码作为片段插入,您将能够测试该方法并在控制台上显示一些输出。 - DJDaveMark
当然没问题!刚刚更新了一小段代码,用于快速测试。 - José Luis Raffalli

0

您可以使用numeral.js来格式化您的时间:

numeral(your_duration.asSeconds()).format('00:00:00') // result: hh:mm:ss

-1
如果您使用的是Angular >2,我创建了一个管道,受到@hai-alaluf回答的启发。
import {Pipe, PipeTransform} from "@angular/core";

@Pipe({
  name: "duration",
})

export class DurationPipe implements PipeTransform {

  public transform(value: any, args?: any): any {

    // secs to ms
    value = value * 1000;
    const days = Math.floor(value / 86400000);
    value = value % 86400000;
    const hours = Math.floor(value / 3600000);
    value = value % 3600000;
    const minutes = Math.floor(value / 60000);
    value = value % 60000;
    const seconds = Math.floor(value / 1000);
    return (days ? days + " days " : "") +
      (hours ? hours + " hours " : "") +
      (minutes ? minutes + " minutes " : "") +
      (seconds ? seconds + " seconds " : "") +
      (!days && !hours && !minutes && !seconds ? 0 : "");
  }
}

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