hoa*_*oan 3 javascript date momentjs
我的持续时间为14秒。
const duration = moment.duration(end.diff(startTime));
Run Code Online (Sandbox Code Playgroud)
如果我想将此持续时间显示为格式化字符串,则可以使用 .humanize()
duration.humanize(true)
// in a few seconds
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,但是有没有办法暂时将其格式化为确切的持续时间,例如,in 14 seconds或者更长的时间,in 2 days and 5 hours而不是in 2 days?
您可以自定义相对时间函数的输出,例如humanize()使用和relativeTime键。updateLocalerelativeTimeThreshold
我不知道一般持续时间的预期输出是什么,但是您可以使用以下代码获取in 14 seconds持续14秒的时间:
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) );Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>Run Code Online (Sandbox Code Playgroud)
我用我制作的这段代码解决了您的问题。
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(", ");
}
Run Code Online (Sandbox Code Playgroud)
该函数采用句点字符串 (ISO 8601),使用 Moment (>2.3.0) 对其进行解析,然后对于每个时间单位,将一个字符串推送到数组中parts。然后parts数组内的所有内容都作为分隔字符串连接在一起", "。
您可以在这里测试它: https: //jsfiddle.net/mvcha2xp/6/
我将它用作 Vue 过滤器,以正确地人性化持续时间。