Skip to content

Instantly share code, notes, and snippets.

@itrelease
Created March 1, 2018 22:26
Show Gist options
  • Save itrelease/d570466105b1857f57fcc198cb6c86a2 to your computer and use it in GitHub Desktop.
Save itrelease/d570466105b1857f57fcc198cb6c86a2 to your computer and use it in GitHub Desktop.
//@flow
const templates = {
prefix: "",
sn: ' and %d seconds',
suffix: " ago",
seconds: "less than a minute",
minute: "about a minute",
minutes: "%d minutes",
hour: "about an hour",
hours: "about %d hours",
day: "a day",
days: "%d days",
month: "about a month",
months: "%d months",
year: "about a year",
years: "%d years"
}
function template (t, n) {
return templates[t] && templates[t].replace(/%d/i, Math.abs(Math.round(n)));
}
export default function timeAgo(sourceTime) {
if (!sourceTime)
return;
let time = sourceTime
time = time.replace(/\.\d+/, ""); // remove milliseconds
time = time.replace(/-/, "/").replace(/-/, "/");
time = time.replace(/T/, " ").replace(/Z/, " UTC");
time = time.replace(/([\+\-]\d\d)\:?(\d\d)/, " $1$2"); // -04:00 -> -0400
time = new Date(time * 1000 || time);
var now = new Date();
var seconds = ((now.getTime() - time) * .001) >> 0;
var minutes = seconds / 60;
var hours = minutes / 60;
var days = hours / 24;
var years = days / 365;
const sn = seconds % 60 === 0
? ''
: template('sn', seconds % 60)
return templates.prefix + (
seconds < 45 && template('seconds', seconds) ||
seconds < 90 && template('minute', 1) || (
minutes < 45 && template('minutes', minutes) ||
minutes < 90 && template('hour', 1) ||
hours < 24 && template('hours', hours) ||
hours < 42 && template('day', 1) ||
days < 30 && template('days', days) ||
days < 45 && template('month', 1) ||
days < 365 && template('months', days / 30) ||
years < 1.5 && template('year', 1) ||
template('years', years)) + sn
) + templates.suffix;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment