Here's my take:
timeSince(123456) => "1 day, 10 hours, 17 minutes, 36 seconds"
And the code:
function timeSince(date, longText) {
let seconds = null;
let leadingText = null;
if (date instanceof Date) {
seconds = Math.floor((new Date() - date) / 1000);
if (seconds < 0) {
leadingText = " from now";
} else {
leadingText = " ago";
}
seconds = Math.abs(seconds);
} else {
seconds = date;
leadingText = "";
}
const intervals = [
[31536000, "year" ],
[ 2592000, "month" ],
[ 86400, "day" ],
[ 3600, "hour" ],
[ 60, "minute"],
[ 1, "second"],
];
let interval = seconds;
let intervalStrings = [];
for (let i = 0; i < intervals.length; i++) {
let divResult = Math.floor(interval / intervals[i][0]);
if (divResult > 0) {
intervalStrings.push(divResult + " " + intervals[i][1] + ((divResult > 1) ? "s" : ""));
interval = interval % intervals[i][0];
if (!longText) {
break;
}
}
}
let intStr = intervalStrings.join(", ");
return intStr + leadingText;
}