Я попробовал это в moment.js
moment.duration(375,'days').humanize()
и получите "год" в качестве ответа, но я бы ожидал "год и 10 дней". Есть ли способ в момент. Js получить полную гуманизованную ценность?
Я попробовал это в moment.js
moment.duration(375,'days').humanize()
и получите "год" в качестве ответа, но я бы ожидал "год и 10 дней". Есть ли способ в момент. Js получить полную гуманизованную ценность?
Я нашел эту небольшую библиотеку, которая отображает только продолжительность отображения (если вам действительно не нужны все функции moment.js)
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
Я смотрел на ту же проблему и, похоже, нет плана по поддержке этого в будущем...
Хотя одно из предлагаемых решений - сделать определение языка, которое переопределяет реализацию гуманизированных сообщений по умолчанию:
https://github.com/timrwood/moment/issues/348
Вид излишнего, если вы спросите меня...
Попробуйте этот плагин:
https://github.com/jsmreese/moment-duration-format
moment.duration(123, "minutes").format("h [hrs], m [min]");
// "2 hrs, 3 min"
Используйте 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);
Эта проблема в Github содержит много дискуссий о том, что именно. Многие просят более точный гуманизованный вариант.
Запишите, зачем вам это нужно, используйте кейсы и т.д.
Я написал этот код 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;
}
Это мое решение, мне это лучше, чем другие:
val moment1 = moment();
val moment2 = mement();
console.log(moment.duration(moment1.diff(moment2)).humanize());
Это мое решение на 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()
Одно из решений:
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"]
Основываясь на решении Игоря Каслашникова, я изменил функцию, чтобы сделать ее еще более точной, используя ванильный 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