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

How do I use format() on a moment.js duration?

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

我希望能够执行以下操作:

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

另外,如果还有其他任何可以轻松容纳这种功能的库,我会对建议感兴趣。

谢谢!


1
2
3
4
5
6
7
8
// 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);

看看JSFiddle


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

1
moment.utc(duration.as('milliseconds')).format('HH:mm:ss')


我们正在考虑为moment.js中的持续时间添加某种格式。参见https://github.com/timrwood/moment/issues/463

http://countdownjs.org/和https://github.com/icambron/twix.js还有一些其他可能会有所帮助的库


使用此插件的Moment Duration Format。

例:

1
moment.duration(123,"minutes").format("h:mm");


1
2
var diff = moment(end).unix() - moment(start).unix();
moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS");


使用以下代码行:

1
moment.utc(moment.duration(4500,"seconds").asMilliseconds()).format("HH:mm:ss")


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

1
2
var duration = moment.duration("09:30"),
    formatted = moment.utc(duration.asMilliseconds()).format("HH:mm");

这将改善@Wilson的答案,因为它不访问私有内部属性_data。


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

1
2
3
const duration = moment.duration(83, 'seconds');
console.log(duration.minutes() + ':' +duration.seconds());
// output: 1:23

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

编辑:

并填充了几秒钟,几分钟和几小时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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


我用:

1
2
var duration = moment.duration("09:30");
var str = moment(duration._data).format("HH:mm");

我在var str中得到" 09:30"。


如果您愿意使用其他JavaScript库,则numeric.js可以按以下格式设置秒数(例如1000秒):

1
2
var string = numeral(1000).format('00:00');
// '00:16:40'


如果差异是片刻

1
2
3
var diff = moment(20111031) - moment(20111010);
var formated1 = moment(diff).format("hh:mm:ss");
console.log("format 1:"+formated1);


在以下情况下,我使用经典格式功能:

1
2
3
4
var diff = moment(end).unix() - moment(start).unix();

//use unix function instead of difference
moment.unix(diff).format('hh:mm:ss')

这是骇客,因为时间差异被视为标准时刻,是较早的日期,但对我们的目标而言并不重要,您不需要任何插件


根据ni-ko-o-kin的回答:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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


如果必须显示所有小时数(大于24),并且如果不需要在小时前显示" 0",则可以使用一小段代码完成格式化:

1
Math.floor(duration.as('h')) + moment.utc(duration.as('ms')).format(':mm:ss')

如果使用角度,则将其添加到过滤器中:

1
2
3
4
5
6
7
8
9
10
11
12
.filter('durationFormat', function () {
    return function (value) {
        var days = Math.floor(value/86400000);
        value = value%86400000;
        var hours = Math.floor(value/3600000);
        value = value%3600000;
        var minutes = Math.floor(value/60000);
        value = value%60000;
        var seconds = Math.floor(value/1000);
        return (days? days + ' days ': '') + (hours? hours + ' hours ': '') + (minutes? minutes + ' minutes ': '') + (seconds? seconds + ' seconds ': '')
    }
})

使用范例

1
 {{diff | durationFormat}}


将持续时间格式化为字符串

1
2
3
4
5
6
7
8
9
10
11
12
var duration = moment.duration(86400000); //value in milliseconds
var hours = duration.hours();
var minutes = duration.minutes();
var seconds = duration.seconds();
var milliseconds = duration.milliseconds();

var date = moment().hours(hours).minutes(minutes).seconds(seconds).millisecond(milliseconds);
if (is12hr){
    return date.format("hh:mm:ss a");
}else{
    return date.format("HH:mm:ss");
}

我的解决方案不涉及任何其他库,并且适用于diff> 24h

1
2
var momentInSeconds = moment.duration(n,'seconds')
console.log(("0" + Math.floor(momentInSeconds.asHours())).slice(-2) + ':' + ("0" + momentInSeconds.minutes()).slice(-2) + ':' + ("0" + momentInSeconds.seconds()).slice(-2))

原生javascript怎么样?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}


使用矩持续时间格式。

客户端框架(例如:React)

1
2
3
4
5
import moment from 'moment';
import momentDurationFormatSetup from 'moment-duration-format';
momentDurationFormatSetup(moment);

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

服务器(node.js)

1
2
3
4
5
6
const moment = require("moment-timezone");
const momentDurationFormatSetup = require("moment-duration-format");

momentDurationFormatSetup(moment);

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

我需要执行此操作,以显示这种格式的小时数。
起初我尝试了这个。

1
moment.utc(totalMilliseconds).format("HH:mm:ss")

但是,超过24小时的所有时间都会将小时重置为0。
但是分钟和秒是准确的。
所以我只用了几分钟和几秒钟。

1
var minutesSeconds = moment.utc(totalMilliseconds).format("mm:ss")

现在我只需要总时间。

1
var hours = moment.duration(totalMilliseconds).asHours().toFixed()

为了获得我们都希望的格式,我们将其粘合在一起。

1
var formatted = hours +":" + minutesSeconds

如果totalMilliseconds894600000,则将返回249:30:00

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


1
2
3
4
5
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 days 14 h 00 min 00 s


1
2
3
4
5
6
7
8
9
10
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`);
})();
1
0h:0m:1s

这可用于获取前两个字符(小时)和后两个字符(分钟)。相同的逻辑可以应用于秒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
     * 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'));
1
2
3
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js">
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js">
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js">


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

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


如何正确使用moment.js持续时间?
|
在代码中使用moment.duration()

首先,您需要导入momentmoment-duration-format

1
2
import moment from 'moment';
import 'moment-duration-format';

然后,使用持续时间功能。让我们应用上面的示例:28800 = 8 am。

1
moment.duration(28800,"seconds").format("h:mm a");

嗯,您没有上述类型错误。您是否在8:00上午获得正确的值?不,您获得的价值是8:00。 Moment.js格式无法正常运行。

解决方案是将秒转换为毫秒,并使用UTC时间。

1
moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a')

好吧,我们现在早上8:00。如果您希望整点时间是上午8点而不是8:00点,则需要执行RegExp

1
2
const time = moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a');
time.replace(/:00/g, '')

您可以使用digit.js设置持续时间的格式:

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

如果您使用Angular> 2,我会根据@ hai-alaluf的答案来制作一个Pipe。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 :"");
  }
}


这对我有用:

1
moment({minutes: 150}).format('HH:mm') // 01:30