Moment JS持续时间更加人性化

时间:2018-12-18 08:10:41

标签: javascript date momentjs

我的持续时间为14秒。

const duration = moment.duration(end.diff(startTime));

如果我想将此持续时间显示为格式化字符串,则可以使用.humanize()

duration.humanize(true)
// in a few seconds

这很好用,但是有一种方法可以将其格式化为in 14 seconds之类的确切持续时间,或者在更长的时间内,以in 2 days and 5 hours而不是{ {1}}?

4 个答案:

答案 0 :(得分:4)

您可以使用questions[question]['incorrect_1']humanize()relativeTime键来自定义诸如relativeTimeThreshold之类的相对时间函数的输出。

我不知道您在一般持续时间内的预期输出是什么,但是您可以使用以下代码在持续14秒的时间内获取updateLocale

in 14 seconds
const startTime = moment();
const end = moment().add(14, 'seconds');
const duration = moment.duration(end.diff(startTime));
console.log( duration.humanize(true) );

moment.relativeTimeThreshold('ss', 60);
moment.updateLocale('en', {
  relativeTime : {
    s: function (number, withoutSuffix, key, isFuture){
      return number + ' seconds';
    }
  }
});

console.log( moment.duration(end.diff(startTime)).humanize(true) );

您还可以查看thisthis相似的问题。

答案 1 :(得分:2)

不。 [Object Object]的唯一参数是后缀切换。如果在the source中检查人性化方法使用的内部函数,则可以看到它总是对持续时间进行取整。如果需要更多的特异性,则需要使用所需的行为来实现自己的方法。

答案 2 :(得分:0)

可能的解决方案是use another library,正如OP所述。

humanizeDuration(3000)      // '3 seconds'
humanizeDuration(2250)      // '2.25 seconds'
humanizeDuration(97320000)  // '1 day, 3 hours, 2 minutes'

答案 3 :(得分:0)

我用我编写的这段代码解决了您的问题。

function formatDuration(period) {
    let parts = [];
    const duration = moment.duration(period);

    // return nothing when the duration is falsy or not correctly parsed (P0D)
    if(!duration || duration.toISOString() === "P0D") return;

    if(duration.years() >= 1) {
        const years = Math.floor(duration.years());
        parts.push(years+" "+(years > 1 ? "years" : "year"));
    }

    if(duration.months() >= 1) {
        const months = Math.floor(duration.months());
        parts.push(months+" "+(months > 1 ? "months" : "month"));
    }

    if(duration.days() >= 1) {
        const days = Math.floor(duration.days());
        parts.push(days+" "+(days > 1 ? "days" : "day"));
    }

    if(duration.hours() >= 1) {
        const hours = Math.floor(duration.hours());
        parts.push(hours+" "+(hours > 1 ? "hours" : "hour"));
    }

    if(duration.minutes() >= 1) {
        const minutes = Math.floor(duration.minutes());
        parts.push(minutes+" "+(minutes > 1 ? "minutes" : "minute"));
    }

    if(duration.seconds() >= 1) {
        const seconds = Math.floor(duration.seconds());
        parts.push(seconds+" "+(seconds > 1 ? "seconds" : "second"));
    }

    return "in "+parts.join(", ");
}

此函数采用句点字符串(ISO 8601),用Moment(> 2.3.0)对其进行解析,然后对于每个时间单位,将字符串推入parts数组中。然后,parts数组中的所有内容都与", "一起连接为分隔字符串。

您可以在这里进行测试:https://jsfiddle.net/mvcha2xp/6/

我将其用作Vue过滤器以正确地使持续时间人性化。