2010-09-17 29 views
89

Este es un problema común, pero no estoy seguro de cómo resolverlo. El siguiente código funciona bien.Javascript segundos a minutos y segundos

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, así que devuelve todos los minutos?

Gracias

+0

Eso es porque cuando el tiempo = 3600, 3600% 3600 es siempre 0 ... así todo lo demás será 0 de acuerdo a su cálculo . – MSI

Respuesta

219

Lo estás haciendo mal. Para obtener el número de minutos completos, se divide el número total de segundos en un 60 (60 segundos/minutos):

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

Y para obtener los segundos restantes, se multiplican los minutos completos con 60 y restar de los segundos totales:

var seconds = time - minutes * 60; 

Ahora si usted también desea obtener las horas completas también, dividir el número total de segundos de 3600 (60 minutos/hora · 60 segundos/minuto) en primer lugar, a continuación, calcular los segundos restantes:

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

Luego calcula los minutos completos y los segundos restantes.

Bono:

Utilice el código siguiente para imprimir-bastante tiempo (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); 
+37

Es un poco más limpio obtener los segundos restantes haciendo 'var segundos = tiempo% 60'. –

+0

¿Cómo agregar el cero inicial a un segundo? El resultado aparece como 0: 5.Quiero que sea 0:05 –

+7

@Radio agregue ceros a la izquierda usando 'function str_pad_left (cadena, pad, longitud) { return (nueva matriz (longitud + 1) .join (pad) + cadena) .slice (-length); } var finalTime = str_pad_left (minutos, '0', 2) + ':' + str_pad_left (segundos, '0', 2); ' – Dru

0

Usted ha hecho lo suficiente para hacer un seguimiento de código minutos y segundos porciones de tiempo.

Lo que podría hacer es añadir 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 le dará lo que necesita también.

+0

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

17

También puede utilizar Fecha objeto 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 sólo funciona para tiempoEnSegundos de menos de 24 horas;)

+1

No se ha pensado en dejar que el objeto Date maneje el formateo. Menos flexible, pero si quieres hh: mm: ss (o una subsección de eso) esto es genial – MartinAnsty

+0

Intenté esto con 25 segundos y me devolvió 01:00:25 lo que equivale a 1 hora y 25 segundos. – timstermatic

+0

Sí, probablemente debido a su zona horaria. He actualizado la solución para manejar este caso. – hamczu

57

Otra solución elegante:

function fancyTimeFormat(time) 
{ 
    // Hours, minutes and seconds 
    var hrs = ~~(time/3600); 
    var mins = ~~((time % 3600)/60); 
    var secs = time % 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; 
} 
+1

Esta solución también funciona para los valores negativos de' time' – Pylinux

+7

¿Cuál es el significado de '~~'? –

+5

Es un Shorhand básico para 'Math.floor', ver [este enlace] (http://rocha.la/JavaScript-bitwise-operators-in-practice). – lapin

0

me pensando en una forma más rápida de hacer esto y esto es lo que surgió con

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

Si queremos convertir "tiempo" para los 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 
2

Seconds to 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)); 
1

Para añadir ceros Realmente no veo el necesita tener una otra función completa donde se puede simplemente utilizar 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); 

Su razón por la que tenemos sentencias condicionales en el primer lugar.

(¿condición? Si es verdadero: si es falso) así que si el ejemplo de los segundos es más de 9 que simplemente mostrar los segundos, añada una cadena 0 antes.

8

Para añadir ceros a la izquierda, sólo haría:

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

Niza y corta

0

puedo sugerir 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

32

Para las personas cayendo en esperando un rápido simple y por lo tanto corto s olución a formato 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 (preferidas) o un String (2 conversión penalties que se puede reducir a la mitad anteponiendo en el + argumento de llamada de función para s como en: fmtMSS(+strSeconds)), que representa segundos enteros positivos s como 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 

desglose:

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: rango negativo podrían añadirse anteponiendo (0>s?(s=-s,'-'):'')+ a la expresión de retorno (en realidad, (0>s?(s=-s,'-'):0)+ podría funcionar tan bien).

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"; 
} 
3

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

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

poner mi granito de arena en:

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

      return [minutes, seconds]; 
     } 

por lo siguiente:

var minutesAndSeconds = convertSecondsToMinutesAndSeconds(101); 

tendrá la siguiente salida:

[1,41]; 

A continuación, se puede imprimir este modo:

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

//TIME : 1 minutes, 41 seconds 
3
function secondsToMinutes(time){ 
    return Math.floor(time/60)+':'+Math.floor(time % 60); 
} 
+2

Esto se puede mejorar con cero relleno los segundos: '' 'función secondsToMinutes (tiempo) { return Math.floor (0/60) + ':' + ('0' + Math.floor (0% 60)) .slice (-2); } '' ' – Kus

+0

¡agradable! gracias @Kus. Solo querrás reemplazar esos dos '0' con' tiempo', ¿estoy en lo correcto? – mikey

+1

@mikey ¡Uy! Sí, 'función secondsToMinutes (tiempo) {return Math.floor (tiempo/60) + ':' + ('0' + Math.floor (tiempo% 60)). Slice (-2)}' – Kus

Cuestiones relacionadas