msToTime function

I have only 2 or 3 functions defined in my settings.js file (so I can use them anywhere) and I sure do seem to use them. Since time math is always working with milliseconds (wait, duration, periods) I found that constantly converting them to hh:mm:ss for the Dashboard or log file became a pain.

I saw on a forum somewhere a small snippet of code called msToTime (author was not identified). That triggered the idea for me to create such a function in my settings.js.file, (under functionGlobalContext: ) so I thought I'd share it.

Once installed there, to call it and use it is as follows:

USE: context.global.msToTime( number, [boolean1], [boolean2] )

      number = time (ms) 
      booloean1 (optional) = true || false || null      (show ms || no ms || no ms)
            NOTE: if no ms, seconds are rounded down ( 00:00:15:852 = 00:00:15 ) 
      booloean2 (optional) = true || false      (JSON out || string out)

EXAMPLES:
context.global.msToTime(1644591214165) = "52 years, 54 days, 14:53:34"
context.global.msToTime(354165) = "00:05:54"
context.global.msToTime(354165, true) = "00:05:54:165"
context.global.msToTime(1644591214165, true) = "52 years, 54 days, 14:53:34:165"
context.global.msToTime(1644591214165, null, true) =
{"years":52,"days":54,"hours":14,"minutes":53,"seconds":34,"milliseconds":165}

If you need just hours and minutes only (assuming input # has no years or days) use substr(0, 5):

var time = {payload: context.global.msToTime(12345678) };
   // result:  "03:25:45"
var time = {payload: context.global.msToTime(12345678).substr(0,5) };
   // result:  "03:25"

Here is the function:

// ,   <--- settings.js: comma is needed if another custom function before this.

msToTime: function msToTime(duration, ms, json) 
{
    if (typeof (duration) != 'number') return "NaN";
    if (duration < 0) return "Err < 0";
    var milliseconds = Math.round(duration % 1000),
        seconds = Math.floor((duration / 1000) % 60),
        minutes = Math.floor((duration / (1000 * 60)) % 60),
        hours = Math.floor((duration / (1000 * 60 * 60)) % 24),
        days = Math.floor((duration / (1000 * 60 * 60 * 24)) % 365),
        years = Math.floor((duration / (1000 * 60 * 60 * 24 * 365)) % 365),
        result, json_result;

    years   = (years > 0) ? years : 0;
    days    = (days > 0)  ? days  : 0;
    hours   = (hours < 10) ? ("00" + hours).slice(-2) : hours;
    minutes = (minutes < 10) ? ("00" + minutes).slice(-2) : minutes;
    seconds = (seconds < 10) ? ("00" + seconds).slice(-2) : seconds;
    milliseconds = ("00" + milliseconds).slice(-3);
    json_result = [{"years": years, "days": days, "hours": Number(hours), "minutes": Number(minutes), "seconds": Number(seconds), "milliseconds": Number(milliseconds) }]; 
    years = (years > 0) ? years + " years, " : "";
    days  = (days  > 0) ? days + " days, " : "";
    if (ms) result = years + days + hours + ":" + minutes + ":" + seconds + ":" + milliseconds
      else  result = years + days + hours + ":" + minutes + ":" + seconds;
    if (json) return json_result 
    else return result;
}

// ,   <--- settings.js: comma is needed if another custom function after this.