import { createDuration } from './create';
|
|
var round = Math.round;
|
var thresholds = {
|
ss: 44, // a few seconds to seconds
|
s : 45, // seconds to minute
|
m : 45, // minutes to hour
|
h : 22, // hours to day
|
d : 26, // days to month
|
M : 11 // months to year
|
};
|
|
// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
|
function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
|
return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
|
}
|
|
function relativeTime (posNegDuration, withoutSuffix, locale) {
|
var duration = createDuration(posNegDuration).abs();
|
var seconds = round(duration.as('s'));
|
var minutes = round(duration.as('m'));
|
var hours = round(duration.as('h'));
|
var days = round(duration.as('d'));
|
var months = round(duration.as('M'));
|
var years = round(duration.as('y'));
|
|
var a = seconds <= thresholds.ss && ['s', seconds] ||
|
seconds < thresholds.s && ['ss', seconds] ||
|
minutes <= 1 && ['m'] ||
|
minutes < thresholds.m && ['mm', minutes] ||
|
hours <= 1 && ['h'] ||
|
hours < thresholds.h && ['hh', hours] ||
|
days <= 1 && ['d'] ||
|
days < thresholds.d && ['dd', days] ||
|
months <= 1 && ['M'] ||
|
months < thresholds.M && ['MM', months] ||
|
years <= 1 && ['y'] || ['yy', years];
|
|
a[2] = withoutSuffix;
|
a[3] = +posNegDuration > 0;
|
a[4] = locale;
|
return substituteTimeAgo.apply(null, a);
|
}
|
|
// This function allows you to set the rounding function for relative time strings
|
export function getSetRelativeTimeRounding (roundingFunction) {
|
if (roundingFunction === undefined) {
|
return round;
|
}
|
if (typeof(roundingFunction) === 'function') {
|
round = roundingFunction;
|
return true;
|
}
|
return false;
|
}
|
|
// This function allows you to set a threshold for relative time strings
|
export function getSetRelativeTimeThreshold (threshold, limit) {
|
if (thresholds[threshold] === undefined) {
|
return false;
|
}
|
if (limit === undefined) {
|
return thresholds[threshold];
|
}
|
thresholds[threshold] = limit;
|
if (threshold === 's') {
|
thresholds.ss = limit - 1;
|
}
|
return true;
|
}
|
|
export function humanize (withSuffix) {
|
if (!this.isValid()) {
|
return this.localeData().invalidDate();
|
}
|
|
var locale = this.localeData();
|
var output = relativeTime(this, !withSuffix, locale);
|
|
if (withSuffix) {
|
output = locale.pastFuture(+this, output);
|
}
|
|
return locale.postformat(output);
|
}
|