Javascript segundos para minutos e segundos

Este é um problema comum, mas não sei como resolvê-lo. O código abaixo funciona bem.

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

No entanto, quando chego a 1 hora ou 3600 segundos, ele retorna 0 minuto e 0 segundo. Como posso evitar isso para devolver todos os minutos?

obrigado

Para obter o número de minutos completos, divida o número total de segundos por 60 (60 segundos / minuto):

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

E para obter os segundos restantes, multiplique os minutos completos por 60 e subtraia do total de segundos:

 var seconds = time - minutes * 60; 

Agora, se você também quiser obter as horas completas, divida o número total de segundos em 3600 (60 minutos / hora · 60 segundos / minuto) primeiro e, em seguida, calcule os segundos restantes:

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

Então você calcula os minutos completos e os segundos restantes.

Bônus:

Use o código a seguir para imprimir bem a hora (sugerida 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); 

Outra solução sofisticada:

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

Para as pessoas que estão esperando uma solução simples e rápida para formatar os segundos em M:SS :

 function fmtMSS(s){return(s-(s%=60))/60+(9 

feito..
A function aceita um Number (preferencial) ou uma String (2 'penalidades' de conversão que você pode reduzir pela metade + no argumento da function como s : fmtMSS(+strSeconds) ), representando números inteiros positivos s como argumento.

Exemplos:

 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 

Demolir:

 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: O intervalo negativo pode ser adicionado ao prefixar (0>s?(s=-s,'-'):'')+ à expressão de retorno (na verdade, (0>s?(s=-s,'-'):0)+ também funcionaria.

Você também pode usar o object Date 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); 

Claro que esta solução funciona apenas para timeInSeconds menos de 24 horas;)

Para adicionar zeros à esquerda, gostaria apenas de fazer:

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

Bom e curto

 function secondsToMinutes(time){ return Math.floor(time / 60)+':'+Math.floor(time % 60); } 

Um forro de um (não funciona com horas):

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

Segundos para 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)); 

Para adicionar zeros eu realmente não vejo a necessidade de ter uma outra function completa onde você pode simplesmente usar por exemplo

 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); 

É por isso que temos declarações condicionais em primeiro lugar.

(condição? se verdadeiro: se falso) assim se o exemplo segundos for mais do que 9 do que apenas mostre segundos mais adicione uma corda 0 antes dela.

Você já fez código suficiente para rastrear minutos e segundos em partes do tempo.

O que você poderia fazer é adicionar o fator horas em:

 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 

Isso lhe daria o que você precisa também.

Eu estava pensando em uma maneira mais rápida de fazer isso e é isso que eu criei

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

Se quisermos converter “tempo” em minutos e segundos, por exemplo:

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

Eu sugiro outra solução:

 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 

Eu sei que foi resolvido de várias maneiras. Eu precisava dessa function para um script do After Effects, em que a poluição por velocidade ou espaço de nomes não é um problema. Eu deixo aqui para alguém que precisa de algo parecido. Eu também escrevi alguns testes e trabalhei bem. Então aqui está o 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"; } 

Coloque meus dois centavos em:

 function convertSecondsToMinutesAndSeconds(seconds){ var minutes; var seconds; minutes = Math.floor(seconds/60); seconds = seconds%60; return [minutes, seconds]; } 

Então, é isso :

 var minutesAndSeconds = convertSecondsToMinutesAndSeconds(101); 

Terá a seguinte saída:

 [1,41]; 

Então você pode imprimi-lo assim:

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

tente isto: Converter o segundo em HOURS, MIN e 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; } 

O strftime.js ( strftime github ) é uma das melhores bibliotecas de formatação de tempo. É extremamente leve – 30KB – e eficaz. Usando-o você pode converter segundos no tempo facilmente em uma linha de código, confiando principalmente na class Date original.

Ao criar uma nova data, cada argumento opcional é posicional da seguinte maneira:

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

Então, se você inicializar uma nova data com todos os argumentos como zero até os segundos, você terá:

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

Você pode ver que 150 segundos é de 2 minutos e 30 segundos, como visto na data criada. Em seguida, usando um formato strftime (“% M:% S” para “MM: SS”), ele produzirá a string de seus minutos.

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

Em uma linha, seria parecido com:

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

Além disso, isso permitiria o suporte intercambiável HH: MM: SS e MM: SS com base no número de segundos. Por exemplo:

 # 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" 

E, claro, você pode simplesmente passar qualquer formato que queira para strftime se quiser que a string de tempo seja mais ou 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 isto ajude.

Outra solução muito mais elegante para isso é a seguinte:

 /** * 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; }; 
 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`; }