Skip to content

Instantly share code, notes, and snippets.

@le-doude
Created February 13, 2018 01:18
Show Gist options
  • Save le-doude/dd5fb35f32522f2af9fef208b92fd4b2 to your computer and use it in GitHub Desktop.
Save le-doude/dd5fb35f32522f2af9fef208b92fd4b2 to your computer and use it in GitHub Desktop.
const RESOLUTIONS = [
{text: 'year', short: 'y', get: (d) => d.getFullYear(), set: (d, v) => d.setFullYear(v) },
{text: 'month', short: 'm', get: (d) => d.getMonth(), set: (d, v) => d.setMonth(v) },
{text: 'day', short: 'd', get: (d) => d.getDate(), set: (d, v) => d.setDate(v) },
{text: 'hour', short: 'h', get: (d) => d.getHours(), set: (d, v) => d.setHours(v) },
{text: 'minute', short: 'mi', get: (d) => d.getMinutes(), set: (d, v) => d.setMinutes(v) }
];
class DateHelper {
timeAgoInWords(date1, {brief, skip, limit} = {}) {
const d2 = new Date(); // now
const d1 = new Date(date1);
const hi = new Date(Math.max(d1, d2));
const lo = new Date(Math.min(d1, d2));
if(!Array.isArray(skip)){
skip = [skip];
}
const res = RESOLUTIONS.reduce(({r, rest}, curr) => {
if(skip.includes(curr.text) || skip.includes(curr.short)) {
return {r, rest};
}
let diff = curr.get(rest) - curr.get(lo);
if(diff > 0) {
r.push(diff + (!!brief ? curr.short : curr.text));
}
curr.set(rest, curr.get(lo));
console.debug(curr.text, r, rest);
return {r, rest: rest};
},{r: [], rest: hi});
if(limit > 0) {
if(limit < res.r.length) {
return '~' + res.r.slice(0, limit).join(!!brief ? '': ' ')
} else {
return res.r.slice(0, limit).join(!!brief ? '': ' ')
}
} else {
return res.r.join(!!brief ? '': ' ');
}
}
}
const dateHelper = new DateHelper();
export default dateHelper;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment