Javascript от секунд до минут и секунд
Это общая проблема, но я не уверен, как ее решить. Приведенный ниже код работает нормально.
var mind = time % (60 * 60);
var minutes = Math.floor(mind / 60);
var secd = mind % 60;
var seconds = Math.ceil(secd);
однако, когда я добираюсь до 1 часа или 3600 секунд, он возвращает 0 минут и 0 секунд. Как я могу избежать этого, чтобы он возвращал все минуты?
спасибо
20 ответов:
чтобы получить количество полных минут, разделите количество секунд на 60 (60 секунд/минута):
var minutes = Math.floor(time / 60);а чтобы получить оставшиеся секунды, умножьте полные минуты на 60 и вычтите из общей суммы секунд:
var seconds = time - minutes * 60;теперь, если вы также хотите получить полные часы тоже, разделите количество полных секунд на 3600 (60 минут/час · 60 секунд/минута), а затем вычислить оставшиеся секунды:
var hours = Math.floor(time / 3600); time = time - hours * 3600;затем вы вычисляете полный минуты и оставшиеся секунды.
бонус:
используйте следующий код, чтобы довольно-распечатать время (предложенное 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);
еще одно причудливое решение:
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; }
~~это сокращение дляMath.floorсм. этой ссылке дополнительная информация
для людей, которые надеются на быстрое простое и, следовательно, короткое решение для форматирования секунд в
M:SS:function fmtMSS(s){return(s-(s%=60))/60+(9<s?':':':0')+s}сделано..
Функция принимает или aNumber(желательно) или aString(2 преобразования "штрафы", которые вы можете вдвое сократить, добавив+в аргументе вызова функции дляsв:fmtMSS(+strSeconds)), представляющая собой положительное целое число секундsкак аргумент.примеры:
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поломки:
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) }Примечание: отрицательный диапазон может быть добавлен путем добавления
(0>s?(s=-s,'-'):'')+к возвращаемому выражению (на самом деле,(0>s?(s=-s,'-'):0)+будет работать также).
вы также можете использовать собственный объект даты:
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);конечно, это решение работает только для timeInSeconds менее 24 часов;)
чтобы добавить ведущие нули, я бы просто сделать:
var minutes = "0" + Math.floor(time / 60); var seconds = "0" + (time - minutes * 60); return minutes.substr(-2) + ":" + seconds.substr(-2);коротко
один лайнер (не работает с часами):
function sectostr(time) { return ~~(time / 60) + ":" + (time % 60 < 10 ? "0" : "") + time % 60; }
секунды до 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));
другая, но гораздо более элегантное решение для этого выглядит следующим образом:
/** * 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; };
для добавления нулей я действительно не вижу необходимости иметь полную другую функцию, где вы можете просто использовать, например
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);именно поэтому у нас есть условные операторы в первую очередь.
(условие?если true:если false), поэтому, если пример секунд больше 9, чем просто показать секунды, добавьте строку 0 перед ней.
вы сделали достаточно кода, чтобы отслеживать минуты и секунды части времени.
что вы могли бы сделать, это добавить фактор часов в:
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Это даст вам то, что вам нужно также.
Я думал о более быстрый способ сделать это, и это то, что я придумал
var sec = parseInt(time); var min=0; while(sec>59){ sec-=60; min++;}Если мы хотим преобразовать "время" в минутах и секундах, например:
// time = 75,3 sec var sec = parseInt(time); //sec = 75 var min=0; while(sec>59){ sec-=60; min++;} //sec = 15; min = 1
Я предлагаю другое решение:
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
Я знаю, что это было решено во многих отношениях. Мне нужна эта функция для сценария After Effects, где скорость или загрязнение пространства имен не является проблемой. Я бросаю его здесь для кого-то, кто нуждается в чем-то подобном. Я также написал несколько тестов и работал нормально. Итак, вот код:
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"; }
поставить мои два цента в :
function convertSecondsToMinutesAndSeconds(seconds){ var minutes; var seconds; minutes = Math.floor(seconds/60); seconds = seconds%60; return [minutes, seconds]; }значит так :
var minutesAndSeconds = convertSecondsToMinutesAndSeconds(101);будет иметь следующий результат :
[1,41];тогда вы можете распечатать его так:
console.log('TIME : ' + minutesSeconds[0] + ' minutes, ' + minutesSeconds[1] + ' seconds'); //TIME : 1 minutes, 41 seconds
попробуйте это : Преобразование секунды в часы, мин и сек.
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; }
strftime.js ( strftime github) является одним из лучших библиотек форматирования времени. Это очень легкий-30KB-и эффективный. Используя его, вы можете легко конвертировать секунды во время в одной строке кода, полагаясь в основном на собственный класс даты.
при создании новой даты, каждый необязательный параметр является позиционным следующим образом:
new Date(year, month, day, hours, minutes, seconds, milliseconds);поэтому, если вы инициализируете новую дату со всеми аргументами как ноль до секунд, вы получите:
var seconds = 150; var date = new Date(0,0,0,0,0,seconds); => Sun Dec 31 1899 00:02:30 GMT-0500 (EST)вы можно увидеть, что 150 секунд-это 2 минуты и 30 секунд, как показано в дате создания. Затем, используя формат strftime ("%M:%S "для" MM:SS"), он выведет строку ваших минут.
var mm_ss_str = strftime("%M:%S", date); => "02:30"в одной строке это будет выглядеть так:
var mm_ss_str = strftime('%M:%S', new Date(0,0,0,0,0,seconds)); => "02:30"плюс это позволит вам взаимозаменяемую поддержку HH:MM:SS и MM: SS на основе количества секунд. Например:
# 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"и, конечно, вы можете просто передать любой формат, который вы хотите strftime, если вы хотите время строка должна быть более или менее семантической.
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!"надеюсь, что это помогает.
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`; }
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>
Comments