Подтвердить что ты не робот

Полная гуманизованная длительность в moment.js

Я попробовал это в moment.js

moment.duration(375,'days').humanize()

и получите "год" в качестве ответа, но я бы ожидал "год и 10 дней". Есть ли способ в момент. Js получить полную гуманизованную ценность?

4b9b3361

Ответ 1

Я нашел эту небольшую библиотеку, которая отображает только продолжительность отображения (если вам действительно не нужны все функции moment.js)

https://github.com/EvanHahn/HumanizeDuration.js

Ответ 2

Moment.js является обеспечение fromNow функции, чтобы получить время длительности в читаемом fromat человека, см http://momentjs.com/docs/#/displaying/fromnow/

Пример:

moment([2007, 0, 29]).fromNow(); // 4 years ago
moment().subtract(375, 'days').fromNow(); // a year ago

Вам нужно использовать стороннюю библиотеку, как предложено @Fluffy

Ответ 3

Я смотрел на ту же проблему и, похоже, нет плана по поддержке этого в будущем...

Хотя одно из предлагаемых решений - сделать определение языка, которое переопределяет реализацию гуманизированных сообщений по умолчанию:

https://github.com/timrwood/moment/issues/348

Вид излишнего, если вы спросите меня...

Ответ 5

Используйте moment.relativeTimeThreshold('y', 365) чтобы установить округление.

moment.relativeTimeThreshold('s', 60);
moment.relativeTimeThreshold('m', 60);
moment.relativeTimeThreshold('h', 24);
moment.relativeTimeThreshold('d', 31);
moment.relativeTimeThreshold('M', 12);
moment.relativeTimeThreshold('y', 365);

Ответ 6

Эта проблема в Github содержит много дискуссий о том, что именно. Многие просят более точный гуманизованный вариант.

Запишите, зачем вам это нужно, используйте кейсы и т.д.

https://github.com/moment/moment/issues/348

Ответ 7

Я написал этот код javascript для гуманизации продолжительности,

function humanizeDuration(timeInMillisecond) {
    var result = "";
    if (timeInMillisecond) {
        if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60 * 24 * 30 * 12))) > 0) {//year
            result = result === 1 ? result + " Year" : result + " Years";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60 * 24 * 30))) > 0) {//months
            result = result === 1 ? result + " Month" : result + " Months";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60 * 24))) > 0) {//days
            result = result === 1 ? result + " Day" : result + " Days";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60))) > 0) {//Hours
            result = result === 1 ? result + " Hours" : result + " Hours";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60))) > 0) {//minute
            result = result === 1 ? result + " Minute" : result + " Minutes";
        } else if ((result = Math.round(timeInMillisecond / 1000)) > 0) {//second
            result = result === 1 ? result + " Second" : result + " Seconds";
        } else {
            result = timeInMillisecond + " Millisec";
        }
    }
    return result;
}

Ответ 8

Это мое решение, мне это лучше, чем другие:

val moment1 = moment();
val moment2 = mement();
console.log(moment.duration(moment1.diff(moment2)).humanize());

Ответ 9

Это мое решение на CoffeeScript:

humanizeDuration = (eventDuration)->
    eventMDuration = Moment.duration(eventDuration, 'seconds');
    eventDurationString = ""
    if (eventMDuration.days() > 0)
        eventDurationString += " " + Moment.duration(eventMDuration.days(), 'days').humanize()
    if (eventMDuration.hours() > 0)
        eventDurationString += " " + Moment.duration(eventMDuration.hours(), 'hours').humanize()
    if (eventMDuration.minutes() > 0)
        eventDurationString += " " + Moment.duration(eventMDuration.minutes(), 'minutes').humanize()

    eventDurationString.trim()

Ответ 10

Одно из решений:

function getCountdown() {
  // diff in seconds, comes through function params
  const diff = 60*60*24*4 + 60*60*22 + 60*35 + 5;
  const MINUTE = 60;
  const HOUR = MINUTE * 60;
  const DAY = HOUR * 24;

  const days = Math.floor(diff / DAY);
  const hDiff = diff % DAY;
  const hours = Math.floor(hDiff / HOUR);
  const mDiff = hDiff % HOUR;
  const minutes = Math.floor(mDiff / MINUTE);
  const seconds = mDiff % MINUTE;

  return [days, hours, minutes, seconds]
    .map(v => (''+v)[1] ? ''+v : '0'+v)
}


output: ["04", "22", "35", "05"]

Ответ 11

Основываясь на решении Игоря Каслашникова, я изменил функцию, чтобы сделать ее еще более точной, используя ванильный Javascript.

function momentHumanize(eventDuration, unit) {
    var eventMDuration = moment.duration(eventDuration, unit);
    var eventDurationArray = [];
    if (eventMDuration.years() > 0) {
        eventDurationArray.push(eventMDuration.years() + ' years');
        eventMDuration.subtract(eventMDuration.years(), 'years')
    }
    if (eventMDuration.months() > 0) {
        eventDurationArray.push(eventMDuration.months() + ' months');
        eventMDuration.subtract(eventMDuration.months(), 'months')
    }
    if (eventMDuration.weeks() > 0) {
        eventDurationArray.push(eventMDuration.weeks() + ' weeks');
        eventMDuration.subtract(eventMDuration.weeks(), 'weeks')
    }
    if (eventMDuration.days() > 0) {
        eventDurationArray.push(eventMDuration.days() + ' days');
        eventMDuration.subtract(eventMDuration.days(), 'days')
    }
    if (eventMDuration.hours() > 0) {
        eventDurationArray.push(eventMDuration.hours() + ' hours');
        eventMDuration.subtract(eventMDuration.hours(), 'hours')
    }
    if (eventMDuration.minutes() > 0) {
        eventDurationArray.push(eventMDuration.minutes() + ' minutes');
    }
    return eventDurationArray.length === 1 ? eventDurationArray[0] : 
    eventDurationArray.join(' and ')
}

Это удалит любую сумму из экземпляра момента, как только оно очеловечит его. Я сделал это, потому что их решение было неточным, учитывая тот момент, когда функция гуманизации округляет значение. Например, если бы у меня было 2,8 часа, это должно было быть 2 hours and an hour. Мое решение удаляет 2 часа из экземпляра, оставляя только 0,8 часа, и не использует моментную гуманизацию, чтобы избежать округления.

Примеры:

momentHumanize(45, 'minutes') // 45 minutes

momentHumanize(4514, 'minutes') // 3 days and 3 hours and 14 minutes

momentHumanize(45145587, 'minutes') // 85 years and 10 months and 1 days and 2 hours and 27 minutes