这是一个常见问题,但我不知道如何解决。下面的代码工作正常。
var mind = time % (60 * 60);
var minutes = Math.floor(mind / 60);
var secd = mind % 60;
var seconds = Math.ceil(secd);
但是,当我达到 1 小时或 3600 秒时,它返回 0 分 0 秒。我怎样才能避免这种情况,以便它返回所有分钟?
这是一个常见问题,但我不知道如何解决。下面的代码工作正常。
var mind = time % (60 * 60);
var minutes = Math.floor(mind / 60);
var secd = mind % 60;
var seconds = Math.ceil(secd);
但是,当我达到 1 小时或 3600 秒时,它返回 0 分 0 秒。我怎样才能避免这种情况,以便它返回所有分钟?
要获得完整的分钟数,请将总秒数除以 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(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;
}
~~
是 的简写Math.floor
,请参阅此链接以获取更多信息
对于希望快速简单且简短的解决方案来将秒格式化为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'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)+
也可以)。
格式 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(':')
}
使用基本的数学和简单的 javascript,只需几行代码即可完成。
示例 - 转换7735 seconds
为HH:MM:SS
.
计算使用:
Math.floor()
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor该
Math.floor()
函数返回小于或等于给定数字的最大整数。
%
算术运算符(余数) - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder当一个操作数除以第二个操作数时,余数运算符返回剩余的余数。它总是带红利的符号。
查看下面的代码。秒除以3600
得到小时数和余数,用于计算分钟数和秒数。
HOURS => 7735 / 3600 = 2 remainder 535
MINUTES => 535 / 60 = 8 remainder 55
SECONDS => 55
许多答案在这里使用复杂的方法来表演几个小时,分钟和秒以适当的方式与领先的零- 45
,04
等,这是可以做到用padStart()
。这适用于字符串,因此必须使用 将数字转换为字符串toString()
。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
该
padStart()
方法用另一个字符串填充当前字符串(多次,如果需要),直到结果字符串达到给定长度。从当前字符串的开头应用填充。
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;
//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
*/