Human readable duration format

JavaScript

function formatDuration(seconds) {
    if (seconds === 0) {
        return 'now';
    }
    var numYears = Math.floor(seconds / (86400 * 365));
    var numDays = Math.floor(seconds % (86400 * 365) / 86400);
    var numHours = Math.floor(((seconds % (86400 * 365)) % 86400) / 3600);
    var numMinutes = Math.floor((((seconds % (86400 * 365)) % 86400) % 3600) / 60);
    var numSeconds = (((seconds % (86400 * 365)) % 86400) % 3600) % 60;

    var secondsFun = function () {
        return (numSeconds ? (((seconds > 60) ? ' and ' + numSeconds + " second" : +numSeconds + " second") + (numSeconds === 1 ? '' : 's')) : '');
    };

    var minutesFun = function () {
        if (numSeconds === 0 && numDays !== 0) {
            return 'and ' + (numMinutes ? numMinutes + " minute" + (numMinutes === 1 ? '' : 's') : '');
        }
        return (numMinutes ? numMinutes + " minute" + (numMinutes === 1 ? '' : 's') : '');
    };

    var hoursFun = function () {
        if (minutesFun().charAt(0) === 'a') {
            return (numHours ? numHours + " hour" + (numHours === 1 ? ' ' : 's ') : '');
        }
        if (numSeconds === 0 && numMinutes === 0) {
            return (numHours ? numHours + " hour" + (numHours === 1 ? '' : 's') : '');
        }

        return (numHours ? numHours + " hour" + (numHours === 1 ? ', ' : 's, ') : '');
    };

    var daysFun = function () {
        return (numDays ? numDays + " day" + (numDays === 1 ? ', ' : 's, ') : '');
    };

    var yearsFun = function () {
        return (numYears ? numYears + " year" + (numYears === 1 ? ', ' : 's, ') : '');
    };

    return yearsFun() + daysFun() + hoursFun() + minutesFun() + secondsFun();
}



console.log(formatDuration((1520265552000-1520264907000)/1000)); // returns "1 hour, 1 minute and 2 seconds"