Это обычная проблема, но я не уверен, как ее решить. Код ниже отлично работает.
var mind = time % (60 * 60);
var minutes = Math.floor(mind / 60);
var secd = mind % 60;
var seconds = Math.ceil(secd);
Однако, когда я добираюсь до 1 часа или 3600 секунд, он возвращает 0 минут и 0 секунд. Как я могу избежать этого, чтобы он возвращал все минуты?
Спасибо
Ответ 1
Чтобы получить количество полных минут, разделите общее количество секунд на 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);
Ответ 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
, см. эту ссылку для получения дополнительной информации
Попробуй онлайн
Ответ 3
Для людей, бросающих надежду на быстрое простое и, следовательно, короткое решение для форматирования секунд в M:SS
:
function fmtMSS(s){return(s-(s%=60))/60+(9<s?':':':0')+s}
сделал..
Функция принимает либо Number
(предпочтительный), либо String
(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 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)+
тоже будет работать).
Ответ 4
Вы также можете использовать собственный объект Date:
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 часов;)
Ответ 5
function secondsToMinutes(time){
return Math.floor(time / 60)+':'+Math.floor(time % 60);
}
Ответ 6
Чтобы добавить ведущие нули, я бы просто сделал:
var minutes = "0" + Math.floor(time / 60);
var seconds = "0" + (time - minutes * 60);
return minutes.substr(-2) + ":" + seconds.substr(-2);
Приятный и короткий
Ответ 7
2019 лучший вариант
Формат 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(':')
}
Ответ 8
Один вкладыш (не работает с часами):
function sectostr(time) {
return ~~(time / 60) + ":" + (time % 60 < 10 ? "0" : "") + time % 60;
}
Ответ 9
Очистите один лайнер, используя ES6
const secondsToMinutes = seconds => Math.floor(seconds / 60) + ':' + ('0' + Math.floor(seconds % 60)).slice(-2);
Ответ 10
Секунды к h: мм: 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));
Ответ 11
Другое, но гораздо более элегантное решение для этого заключается в следующем:
/**
* 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;
};
Ответ 12
Следующая функция поможет вам получить дни, часы, минуты, секунды
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));
Ответ 13
После всего этого, еще одно простое решение:
const time = new Date(null);
time.setSeconds(7530);
console.log(time.getHours(), time.getMinutes(), time.getSeconds());
Ответ 14
Для добавления нулей я действительно не вижу необходимости иметь полную другую функцию, где вы можете просто использовать, например,
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);
Его почему у нас есть условные утверждения в первую очередь.
(condition? if true: if false), поэтому если пример секунд больше 9, чем просто показать секунды, добавьте перед ним строку 0.
Ответ 15
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>
Ответ 16
Вы сделали достаточно кода, чтобы отслеживать минуты и секунды.
Что вы можете сделать, так это добавить фактор часов в:
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
Это даст вам то, что вам нужно.
Ответ 17
Я думал о более быстром способе сделать это, и вот что я придумал
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
Ответ 18
Я предлагаю другое решение:
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
Ответ 19
Я знаю, что это было решено во многих отношениях. Мне нужна эта функция для After Effects script, где проблема с загрязнением пространства или пространства имен не является проблемой. Я бросаю его сюда для кого-то, кому что-то похожее. Я также написал несколько тестов и отлично работал. Итак, вот код:
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";
}
Ответ 20
Поместите мои два цента в:
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
Ответ 21
попробуйте это: преобразование секунд в часы, минуты и секунды.
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;
}
Ответ 22
strftime.js(strftime github) - одна из лучших библиотек форматирования времени. Это чрезвычайно легкий - 30 КБ - и эффективный. Используя его, вы можете легко конвертировать секунды в время в одной строке кода, полагаясь главным образом на собственный класс Date.
При создании новой даты каждый необязательный аргумент позиционируется следующим образом:
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"
Плюс это позволит вам взаимозаменяемо поддерживать ЧЧ: ММ: СС и ММ: СС в зависимости от количества секунд. Например:
# 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!"
Надеюсь это поможет.
Ответ 23
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';
}