Convert Seconds to Human Readable Duration
From Hawk Wiki
/** * Convert to human readable time duration * @param seconds * @param desiredUnit {string} The desired unit. can be "W", "D", "H", "M" * unitCount {number} How many units to show * @returns { * value: {number} seconds input, * text: {string} "Time remaining text", * secondsLeft: {number} seconds left not showing in the text * } * (ignore the unit smaller than the 2nd unit. if desiredUnit = "D", unitCount = 2, 1d1m show "1d") */ var toHumanReadableDuration = function (seconds, desiredUnit, unitCount) { var that = this; /** * Return a text with number and unit * @param number the number * @param unitName the unit text * @returns {*} */ var numberWithUnit = function (number, unitName) { return number + unitName; }; // General function to return data based on unit and secondsInUnit var getTimeByUnit = function (secondsTmp, unit, secondsInUnit) { var ret = Math.floor(secondsTmp / secondsInUnit); return { value: ret, text: ret > 0 ? numberWithUnit(ret, unit) : "", // How many seconds left after Math.floor. Means how many second is omitted secondsLeft: secondsTmp - ret * secondsInUnit }; }; var ret = { value: seconds, text: "", secondsLeft: 0 }; //If the duration is <=0, just return if (seconds <= 0) { return ret; } // Call corresponding function based on the unit param var unitFuncMappings = [{ "unit": "W", "secondsInUnit": 604800 //seconds in a week }, { "unit": "D", "secondsInUnit": 86400 }, { "unit": "H", "secondsInUnit": 3600 }, { "unit": "M", "secondsInUnit": 60 }, { "unit": "S", "secondsInUnit": 1 }]; // Find the index of desired unit var unitIndex = 0, i; for (i = 0; i < unitFuncMappings.length; i++) { if (unitFuncMappings[i].unit == unit) { unitIndex = i; break; } } // Get the time format for desired unitCount for (i = unitIndex; i < unitFuncMappings.length; i++) { if (getTimeByUnit(seconds, unitFuncMappings[i].unit, unitFuncMappings[i].secondsInUnit).value > 0) { for (var j = 0; j < unitCount; j++) { if (unitFuncMappings[i + j]) { var retTmp = getTimeByUnit(seconds, unitFuncMappings[i].unit, unitFuncMappings[i].secondsInUnit); if (j > 0) { ret.text += " "; // add a space between time units } ret.text += retTmp.text; ret.secondsLeft = retTmp.secondsLeft; seconds = retTmp.secondsLeft; //refresh seconds for next calculation } } break; } } return ret; }