Javascript segundos a minutos y segundos

170

Este es un problema común pero no estoy seguro de cómo resolverlo. El siguiente código funciona bien.

var mind = time % (60 * 60);
var minutes = Math.floor(mind / 60);

var secd = mind % 60;
var seconds = Math.ceil(secd);

Sin embargo, cuando llego a 1 hora o 3600 segundos, devuelve 0 minutos y 0 segundos. ¿Cómo puedo evitar esto para que devuelva todos los minutos?

Gracias

James Moore
fuente
Eso es porque cuando time = 3600, 3600% 3600 siempre es 0 ... así que todo lo demás será 0 de acuerdo con su cálculo.
MSI

Respuestas:

338

Para obtener el número de minutos completos, divida el número de segundos totales por 60 (60 segundos / minuto):

var minutes = Math.floor(time / 60);

Y para obtener los segundos restantes, multiplique los minutos completos por 60 y reste del total de segundos:

var seconds = time - minutes * 60;

Ahora, si también desea obtener las horas completas, divida el número de segundos totales por 3600 (60 minutos / hora · 60 segundos / minuto) primero, luego calcule los segundos restantes:

var hours = Math.floor(time / 3600);
time = time - hours * 3600;

Luego calcula los minutos completos y los segundos restantes.

Prima:

Use el siguiente código para imprimir la hora bonita (sugerido por Dru)

function str_pad_left(string,pad,length) {
    return (new Array(length+1).join(pad)+string).slice(-length);
}

var finalTime = str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);
Gumbo
fuente
57
Es un poco más limpio obtener los segundos restantes haciendo 'var segundos = tiempo% 60'.
Edward D'Souza
11
@Radio añadir ceros a la izquierda usando function str_pad_left(string,pad,length){ return (new Array(length+1).join(pad)+string).slice(-length); } var finalTime = str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);
Dru
1
Esta solución no funcionará para valores negativos de time. Si, por ejemplo, ingresas -1 segundos, obtienes -1 minuto y 59 segundos de regreso ...
Pylinux
55
¿Cuál es el sentido de tener negativo time? Lógicamente, una diferencia horaria siempre es positiva
mcont
44
Puede usar el módulo para obtener la cantidad de segundos, en mi opinión, es más legible. var seconds = time % 60
JCM
106

Otra solución elegante:

function fancyTimeFormat(duration)
{   
    // Hours, minutes and seconds
    var hrs = ~~(duration / 3600);
    var mins = ~~((duration % 3600) / 60);
    var secs = ~~duration % 60;

    // Output like "1:01" or "4:03:59" or "123:03:59"
    var ret = "";

    if (hrs > 0) {
        ret += "" + hrs + ":" + (mins < 10 ? "0" : "");
    }

    ret += "" + mins + ":" + (secs < 10 ? "0" : "");
    ret += "" + secs;
    return ret;
}

~~es una abreviatura para Math.floorver este enlace para más información

Probar en línea

Vishal
fuente
14
¿Cuál es el significado de ~~?
mcont
9
Es un shorhand básico para Math.floorver este enlace .
lapin
Funciona bien ..... :) Puede redondear el valor de esta manera hrs = hrs.toFixed (0); mins = mins.toFixed (0); secs = secs.toFixed (0);
Abdul Khaliq
1
¡Gracias por esta solución! Agregué time = math.round(time)a la primera línea para darme segundos redondeados.
fotoflo
Esta es la solución más correcta. Como se indicó anteriormente, la solución con más votos en esta página muestra 180 segundos como 2m60s.
SongBox
71

Para las personas que esperan obtener una solución rápida, simple y, por lo tanto, corta para formatear segundos en M:SS:

function fmtMSS(s){return(s-(s%=60))/60+(9<s?':':':0')+s}

hecho ..
La función acepta ya sea un Number(preferido) o una String(2 conversión penalties que se puede reducir a la mitad anteponiendo +en el argumento de la llamada de función para la sque en: fmtMSS(+strSeconds)), que representa segundos enteros positivos scomo argumento.

Ejemplos:

fmtMSS(    0 );  //   0:00
fmtMSS(   '8');  //   0:08
fmtMSS(    9 );  //   0:09
fmtMSS(  '10');  //   0:10
fmtMSS(   59 );  //   0:59
fmtMSS( +'60');  //   1:00
fmtMSS(   69 );  //   1:09
fmtMSS( 3599 );  //  59:59
fmtMSS('3600');  //  60:00
fmtMSS('3661');  //  61:01
fmtMSS( 7425 );  // 123:45

Descompostura:

function fmtMSS(s){   // accepts seconds as Number or String. Returns m:ss
  return( s -         // take value s and subtract (will try to convert String to Number)
          ( s %= 60 ) // the new value of s, now holding the remainder of s divided by 60 
                      // (will also try to convert String to Number)
        ) / 60 + (    // and divide the resulting Number by 60 
                      // (can never result in a fractional value = no need for rounding)
                      // to which we concatenate a String (converts the Number to String)
                      // who's reference is chosen by the conditional operator:
          9 < s       // if    seconds is larger than 9
          ? ':'       // then  we don't need to prepend a zero
          : ':0'      // else  we do need to prepend a zero
        ) + s ;       // and we add Number s to the string (converting it to String as well)
}

Nota: El rango negativo podría agregarse anteponiendo (0>s?(s=-s,'-'):'')+a la expresión de retorno (en realidad, (0>s?(s=-s,'-'):0)+también funcionaría).

GitaarLAB
fuente
Sugeriría agregar Math.floor(s)a la última línea para obtener resultados más limpios. Funciona muy bien de todos modos, gracias!
Diego Fortes
@PossessWithin: No, NO debe "agregar Math.floor (s) a la última línea" (del fragmento de desglose) por varias razones, principalmente porque eso introduciría un error para los valores entre 9y 10sin modificaciones adicionales; si ingresó, por ejemplo 69.25, ¡la salida sería en 1:9lugar de 1:09! Esta función (para la cual especifiqué explícitamente los segundos enteros) está diseñada y diseñada con mucho cariño como herramienta / 'motor' de crujido de alto rendimiento (no tiene golf ninja para el tamaño) y, como tal, considero inapropiado cargar ese motor con verificación innecesaria / cleanup / filtering ...
GitaarLAB
... trabajo (como NaN, +/-Infinityetc.) y opciones de redondeo que debe hacer el programador, antes de llamar a la función, en función de las necesidades específicas y los posibles valores de entrada que la aplicación puede encontrar. Naturalmente, es libre de parchearlo si su conocimiento del dominio sobre los valores de entrada esperados dicta que su caso de uso particular casi siempre recibe valores de punto flotante y las pruebas de rendimiento indican que su aplicación. En su caso en el que desea parchear solo en pisos de valores positivos , DEBE ...
GitaarLAB
... modificar (9<s?':':':0')a (10>s?':0':':')(agregando 1 carácter pero 'sacrificando' 5 de 6 rutas verdaderas a rutas falsas) O (10<=s?':':':0')(agregando 2 caracteres pero manteniendo 5 de 6 rutas verdaderas). Luego, le aconsejo que cambie ese final final +sen +(s|0) lugar de Math.floor(s) , para no destruir la belleza de no tener que resolver y llamar Math.floor mientras todavía funciona correctamente en todo el+/-MAX_SAFE_INTEGER rango de 53 bits en lugar de 'solo' rango de 32 bits (sin firmar) o 31 bits (con firma). Tenga en cuenta que ABS(s)se garantiza que magnetude sea menor que 60, por lo que el firmado ...
GitaarLAB
... firmado a nivel de bit O es seguro. También tenga en cuenta que esta modificación en particular sin poner en el suelo los segundos restantes haría que la función produjera segundos fraccionarios sin arrastrar ceros fraccionarios, pero a menudo tendrá más de 3 dígitos fraccionales significativos distintos de cero que probablemente también necesite manejar. Finalmente, cuando se combina con el código opcional de pre-arreglo para rango negativo, esta modificación particular efectivamente TRUNCATE los segundos (no los PISOS ). PS: PFFT, whoever came up with just 512 char limit for any meaningful comment should be...
GitaarLAB
21

También puede usar el objeto Fecha nativo:

var date = new Date(null);
date.setSeconds(timeInSeconds);

// retrieve time ignoring the browser timezone - returns hh:mm:ss
var utc = date.toUTCString();
// negative start index in substr does not work in IE 8 and earlier
var time = utc.substr(utc.indexOf(':') - 2, 8)

// retrieve each value individually - returns h:m:s
var time = date.getUTCHours() + ':' + date.getUTCMinutes() + ':' +  date.getUTCSeconds();

// does not work in IE8 and below - returns hh:mm:ss
var time = date.toISOString().substr(11, 8);

// not recommended - only if seconds number includes timezone difference
var time = date.toTimeString().substr(0, 8);

Por supuesto, esta solución solo funciona durante timeInSeconds menos de 24 horas;)

hamczu
fuente
1
No había pensado en dejar que el objeto Date manejara el formato. Menos flexible, pero si quieres hh: mm: ss (o una subsección de eso) esto es genial
MartinAnsty
Intenté esto con 25 segundos y devolvió 01:00:25 que equivale a 1 hora y 25 segundos.
timstermatic
Sí, probablemente debido a su zona horaria. He actualizado la solución para manejar este caso.
hamczu
datetambién podría ser construido comovar date = new Date(timeInSeconds * 1000)
Nuno André
20

2019 mejor variante

Formato hh:mm:ss

console.log(display(60 * 60 * 2.5 + 25)) // 2.5 hours + 25 seconds

function display (seconds) {
  const format = val => `0${Math.floor(val)}`.slice(-2)
  const hours = seconds / 3600
  const minutes = (seconds % 3600) / 60

  return [hours, minutes, seconds % 60].map(format).join(':')
}

Илья Зеленько
fuente
hmmm, secondses constante. No puedes reasignarlo.
ronapelbaum
@ronapelbaum este argumento, no constante, no entiendo lo que quieres decir
Илья Зеленько
@ronapelbaum si asigna los segundos en lugar de obtenerlos como parámetro que tiene que usar let, por ejemplo, ¿ function display (state) { let seconds = state.seconds; ... }fue de ahí de dónde vino su error?
retrovertigo
Una función param debe tratarse como constante. Cuando usas %=estás reasignando este parámetro. Solo useseconds%60
ronapelbaum
16
function secondsToMinutes(time){
    return Math.floor(time / 60)+':'+Math.floor(time % 60);
}
El0din
fuente
3
Esto se puede mejorar con cero relleno de segundos: function secondsToMinutes(time){ return Math.floor(0 / 60)+':'+('0'+Math.floor(0 % 60)).slice(-2); }
Kus
¡bonito! gracias @Kus. Es posible que desee reemplazar esos dos 0s con time, ¿estoy en lo cierto?
mikey
2
@mikey ¡Uy! Sí,function secondsToMinutes(time){ return Math.floor(time / 60) + ':' + ('0' + Math.floor(time % 60)).slice(-2) }
Kus
12

Para agregar ceros a la izquierda, simplemente haría:

var minutes = "0" + Math.floor(time / 60);
var seconds = "0" + (time - minutes * 60);
return minutes.substr(-2) + ":" + seconds.substr(-2);

Agradable y corto

Ids Klijnsma
fuente
9

Limpie un revestimiento usando ES6


const secondsToMinutes = seconds => Math.floor(seconds / 60) + ':' + ('0' + Math.floor(seconds % 60)).slice(-2);
Sam Logan
fuente
6

Un trazador de líneas (no funciona con horas):

 function sectostr(time) {
    return ~~(time / 60) + ":" + (time % 60 < 10 ? "0" : "") + time % 60;
 }
Dillon
fuente
4

Segundos a h: mm: ss

var hours = Math.floor(time / 3600);
time -= hours * 3600;

var minutes = Math.floor(time / 60);
time -= minutes * 60;

var seconds = parseInt(time % 60, 10);

console.log(hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds));
kayz1
fuente
¿Puede alguien explicarme minutes < 10 ? '0' + minutes : minutes, asumiendo solo conocimientos básicos de js?
Zediiiii
Si los minutos son de un solo dígito (<10), se antepone el cero inicial; de lo contrario, no.
kayz1
¡Eso ayuda! No me di cuenta de que "?" fue el operador ternario en js.
Zediiiii
4

La siguiente función lo ayudará a obtener días, horas, minutos, segundos

toDDHHMMSS(inputSeconds){
        const Days = Math.floor( inputSeconds / (60 * 60 * 24) );
        const Hour = Math.floor((inputSeconds % (60 * 60 * 24)) / (60 * 60));
        const Minutes = Math.floor(((inputSeconds % (60 * 60 * 24)) % (60 * 60)) / 60 );
        const Seconds = Math.floor(((inputSeconds % (60 * 60 * 24)) % (60 * 60)) % 60 );
        let ddhhmmss  = '';
        if (Days > 0){
            ddhhmmss += Days + ' Day ';
        }
        if (Hour > 0){
            ddhhmmss += Hour + ' Hour ';
        }

        if (Minutes > 0){
            ddhhmmss += Minutes + ' Minutes ';
        }

        if (Seconds > 0){
            ddhhmmss += Seconds + ' Seconds ';
        }
        return ddhhmmss;
    }
alert( toDDHHMMSS(2000));
sivamani s
fuente
Me gusta este. He cambiado if (Days > 0){ ddhhmmss += Days + ' Day '; }a if (Days > 0) {ddhhmmss += Days === 1 ? Days + ' Day ' : Days + ' Days '};decir 1 Day, 2 Days, 3 Daysetc. similares se puede hacer por los demás.
Ste
4

Después de todo esto, otra solución más simple:

const time = new Date(null);
time.setSeconds(7530);
console.log(time.getHours(), time.getMinutes(), time.getSeconds());
usuario2734839
fuente
1
Usando time.setSeconds(1);devoluciones 1 0 1cuando debería ser 0 0 1.
Ste
3

Otra solución mucho más elegante para esto es la siguiente:

/**
 * Convert number secs to display time
 *
 * 65 input becomes 01:05.
 *
 * @param Number inputSeconds Seconds input.
 */
export const toMMSS = inputSeconds => {
    const secs = parseInt( inputSeconds, 10 );
    let minutes = Math.floor( secs / 60 );
    let seconds = secs - minutes * 60;

    if ( 10 > minutes ) {
        minutes = '0' + minutes;
    }
    if ( 10 > seconds ) {
        seconds = '0' + seconds;
    }

    // Return display.
    return minutes + ':' + seconds;
};
Ahmad Awais
fuente
2

Para agregar ceros, realmente no veo la necesidad de tener otra función completa donde simplemente pueda usar, por ejemplo

var mins=Math.floor(StrTime/60);
var secs=StrTime-mins * 60;
var hrs=Math.floor(StrTime / 3600);
RoundTime.innerHTML=(hrs>9?hrs:"0"+hrs) + ":" + (mins>9?mins:"0"+mins) + ":" + (secs>9?secs:"0"+secs);

Es por eso que tenemos declaraciones condicionales en primer lugar.

(condición? si es verdadero: si es falso) así que si los segundos de ejemplo son más de 9 que solo mostrar segundos, agregue una cadena 0 antes.

Destino
fuente
2

intente esto: convirtiendo el segundo a HORAS, MIN y SEC.

function convertTime(sec) {
    var hours = Math.floor(sec/3600);
    (hours >= 1) ? sec = sec - (hours*3600) : hours = '00';
    var min = Math.floor(sec/60);
    (min >= 1) ? sec = sec - (min*60) : min = '00';
    (sec < 1) ? sec='00' : void 0;

    (min.toString().length == 1) ? min = '0'+min : void 0;    
    (sec.toString().length == 1) ? sec = '0'+sec : void 0;    

    return hours+':'+min+':'+sec;
}
Sushil
fuente
2

var seconds = 60;
var measuredTime = new Date(null);
measuredTime.setSeconds(seconds); // specify value of SECONDS
var Time = measuredTime.toISOString().substr(11, 8);
document.getElementById("id1").value = Time;
<div class="form-group">
  <label for="course" class="col-md-4">Time</label>
  <div class="col-md-8">
    <input type="text" class="form-control" id="id1" name="field">Min
  </div>
</div>

Anmol Devta
fuente
2

Si está utilizando Moment.js , puede usar el Durationobjeto incorporado

const duration = moment.duration(4825, 'seconds');

const h = duration.hours(); // 1
const m = duration.minutes(); // 20
const s = duration.seconds(); // 25
Gil Epshtain
fuente
2

ACTUALIZACIÓN 2020

Usando matemáticas básicas y JavaScript simple, esto se puede hacer en solo unas pocas líneas de código.

EJEMPLO - Convertir 7735 secondsa HH:MM:SS.


MATEMÁTICAS:

Uso de cálculos:

  1. Math.floor()- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

La Math.floor()función devuelve el entero más grande menor o igual a un número dado.

  1. %operador aritmético (resto): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder

El operador restante devuelve el resto restante cuando un operando se divide por un segundo operando. Siempre toma el signo del dividendo.

Mira el código a continuación. Los segundos se dividen entre 3600para obtener el número de horas y el resto, que se utiliza para calcular el número de minutos y segundos.

HOURS => 7735 / 3600 = 2 remainder 535

MINUTES => 535 / 60 = 8 remainder 55

SECONDS => 55


CEROS A LA IZQUIERDA:

Muchas respuestas aquí usan métodos complicados para mostrar el número de horas, minutos y segundos de manera adecuada con cero a la izquierda 45, 04etc. Esto se puede hacer usando padStart(). Esto funciona para cadenas, por lo que el número debe convertirse a cadena usando toString().

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

El padStart()método rellena la cadena actual con otra cadena (varias veces, si es necesario) hasta que la cadena resultante alcanza la longitud dada. El relleno se aplica desde el inicio de la cadena actual.


CÓDIGO:

function secondsToTime(e){
    var h = Math.floor(e / 3600).toString().padStart(2,'0'),
        m = Math.floor(e % 3600 / 60).toString().padStart(2,'0'),
        s = Math.floor(e % 60).toString().padStart(2,'0');
    
    return h + ':' + m + ':' + s;
}

console.log(secondsToTime(7735));  //02:08:55

/*
secondsToTime(SECONDS) => HH:MM:SS 

secondsToTime(8)       => 00:00:08 
secondsToTime(68)      => 00:01:08
secondsToTime(1768)    => 00:29:28
secondsToTime(3600)    => 01:00:00
secondsToTime(5296)    => 01:28:16
secondsToTime(7735)    => 02:08:55
secondsToTime(45296)   => 12:34:56
secondsToTime(145296)  => 40:21:36
secondsToTime(1145296) => 318:08:16
*/

Jakub Muda
fuente
1

Has hecho suficiente código para rastrear minutos y segundos porciones de tiempo.

Lo que podría hacer es agregar el factor horas en:

var hrd = time % (60 * 60 * 60);
var hours = Math.floor(hrd / 60);

var mind = hrd % 60;
var minutes = Math.floor(mind / 60);

var secd = mind % 60;
var seconds = Math.ceil(secd);

var moreminutes = minutes + hours * 60

Esto te daría lo que necesitas también.

Nevyn
fuente
Intenté esto usando "tiempo" como segundos y no funcionó. Por ejemplo, 975 segundos significa hrd = 975, lo que significa que las horas son 16.
Spedge
1

Estaba pensando en una forma más rápida de hacer esto y esto es lo que se me ocurrió

var sec = parseInt(time);
var min=0;
while(sec>59){ sec-=60; min++;}

Si queremos convertir el "tiempo" en minutos y segundos, por ejemplo:

// time = 75,3 sec
var sec = parseInt(time); //sec = 75
var min=0;
while(sec>59){ sec-=60; min++;} //sec = 15; min = 1
Kamen Kotsev
fuente
1

Pon mis dos centavos en:

function convertSecondsToMinutesAndSeconds(seconds){
            var minutes;
            var seconds;
            minutes = Math.floor(seconds/60);
            seconds = seconds%60;

            return [minutes, seconds];
        }

Así que esto :

var minutesAndSeconds = convertSecondsToMinutesAndSeconds(101);

Tendrá el siguiente resultado:

[1,41];

Luego puede imprimirlo así:

console.log('TIME : ' +  minutesSeconds[0] + ' minutes, ' + minutesSeconds[1] + ' seconds');

//TIME : 1 minutes, 41 seconds
thatOneGuy
fuente
1

strftime.js ( strftime github ) es una de las mejores bibliotecas de formato de tiempo. Es extremadamente ligero, 30 KB, y efectivo. Utilizándolo, puede convertir segundos en tiempo fácilmente en una línea de código, confiando principalmente en la clase Date nativa.

Al crear una nueva Fecha, cada argumento opcional es posicional de la siguiente manera:

new Date(year, month, day, hours, minutes, seconds, milliseconds);

Entonces, si inicializa una nueva Fecha con todos los argumentos como cero hasta los segundos, obtendrá:

var seconds = 150;
var date = new Date(0,0,0,0,0,seconds);
=> Sun Dec 31 1899 00:02:30 GMT-0500 (EST)

Puede ver que 150 segundos son 2 minutos y 30 segundos, como se ve en la fecha de creación. Luego, utilizando un formato de tiempo de ejecución ("% M:% S" para "MM: SS"), generará la cadena de minutos.

var mm_ss_str = strftime("%M:%S", date);
=> "02:30"

En una línea, se vería así:

var mm_ss_str = strftime('%M:%S', new Date(0,0,0,0,0,seconds));
=> "02:30"

Además, esto le permitiría un soporte intercambiable HH: MM: SS y MM: SS en función de la cantidad de segundos. Por ejemplo:

# Less than an Hour (seconds < 3600)
var seconds = 2435;
strftime((seconds >= 3600 ? '%H:%M:%S' : '%M:%S'), new Date(0,0,0,0,0,seconds));
=> "40:35"

# More than an Hour (seconds >= 3600)
var seconds = 10050;
strftime((seconds >= 3600 ? '%H:%M:%S' : '%M:%S'), new Date(0,0,0,0,0,seconds));
=> "02:47:30"

Y, por supuesto, puede simplemente pasar el formato que desee a medio tiempo si desea que la cadena de tiempo sea más o menos semántica.

var format = 'Honey, you said you\'d be read in %S seconds %M minutes ago!';
strftime(format, new Date(0,0,0,0,0,1210));
=> "Honey, you said you'd be read in 10 seconds 20 minutes ago!"

Espero que esto ayude.

Sebastian Scholl
fuente
1
export function TrainingTime(props) {
    const {train_time } = props;
    const hours = Math.floor(train_time/3600);
    const minutes = Math.floor((train_time-hours * 3600) / 60);
    const seconds = Math.floor((train_time%60));

    return `${hours} hrs  ${minutes} min  ${seconds} sec`;
}
Abdul Rehman
fuente
2
Bienvenido a Stack Overflow. Según lo sugerido por @PhilRoggenbuck, una explicación ayudaría. Para obtener más información, lea stackoverflow.com/help/how-to-answer
Mikkel
0

Sugiero otra solución:

function formatTime(nbSeconds, hasHours) {
    var time = [],
        s = 1;
    var calc = nbSeconds;

    if (hasHours) {
        s = 3600;
        calc = calc / s;
        time.push(format(Math.floor(calc)));//hour
    }

    calc = ((calc - (time[time.length-1] || 0)) * s) / 60;
    time.push(format(Math.floor(calc)));//minute

    calc = (calc - (time[time.length-1])) * 60;
    time.push(format(Math.round(calc)));//second


    function format(n) {//it makes "0X"/"00"/"XX"
        return (("" + n) / 10).toFixed(1).replace(".", "");
    }

    //if (!hasHours) time.shift();//you can set only "min: sec"

    return time.join(":");
};
console.log(formatTime(3500));//58:20
console.log(formatTime(305));//05:05
console.log(formatTime(75609, true));//21:00:09
console.log(formatTime(0, true));//00:00:00

Sherali Turdiyev
fuente
0

Sé que se ha resuelto de muchas maneras. Necesitaba esta función para un script de After Effects, donde la velocidad o la contaminación del espacio de nombres no es un problema. Lo dejo aquí para alguien que necesita algo similar. También escribí algunas pruebas y funcionó bien. Así que aquí está el código:

Number.prototype.asTime = function () {
    var hour = Math.floor(this / 3600),
        min = Math.floor((this - hour * 3600) / 60),
        sec = this - hour * 3600 - min * 60,
        hourStr, minStr, secStr;
    if(hour){
        hourStr = hour.toString(),
        minStr = min < 9 ? "0" + min.toString() : min.toString();
        secStr = sec < 9 ? "0" + sec.toString() : sec.toString();
        return hourStr + ":" + minStr + ":" + secStr + "hrs";
    }
    if(min){
        minStr = min.toString();
        secStr = sec < 9 ? "0" + sec.toString() : sec.toString();
        return  minStr + ":" + secStr + "min";
    }
    return sec.toString() + "sec";
}
vladblindu
fuente