Javascript 秒到分钟和秒

IT技术 javascript
2021-02-07 01:11:48

这是一个常见问题,但我不知道如何解决。下面的代码工作正常。

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

但是,当我达到 1 小时或 3600 秒时,它返回 0 分 0 秒。我怎样才能避免这种情况,以便它返回所有分钟?

6个回答

要获得完整的分钟数,请将总秒数除以 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);
您可以使用模数来获取秒数,在我看来它更具可读性。 var seconds = time % 60
2021-04-03 01:11:48
通过执行“var seconds = time % 60”来获得剩余秒数会更清晰一些。
2021-04-07 01:11:48
@Radio 使用添加前导零 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);
2021-04-08 01:11:48
您可以使用内置的 JavaScriptstring.padStart()方法用零填充单个数字。
2021-04-10 01:11:48
消极是什么感觉time逻辑上时差总是正数
2021-04-12 01:11:48

另一个奇特的解决方案:

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,请参阅此链接以获取更多信息

在线试用

是什么意思~~
2021-03-29 01:11:48
它的工作正常..... :) 您可以像这样舍入该值 hrs = hrs.toFixed(0); mins = mins.toFixed(0); 秒 = secs.toFixed(0);
2021-03-30 01:11:48
这是 的基本速记Math.floor,请参阅此链接
2021-04-03 01:11:48
感谢您的解决方案!我添加time = math.round(time)到第一行给我四舍五入的秒数。
2021-04-04 01:11:48
这是更正确的解决方案。如上所述,此页面上得票最多的解决方案将 180 秒显示为 2m60s。
2021-04-04 01:11:48

对于希望快速简单且简短的解决方案来将秒格式化为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)+也可以)。

...工作(如NaN+/-Infinity等)和舍入选项应该由程序员来完成,先调用函数,根据具体需要和可能的输入值,应用程序可能会遇到来!如果您对预期输入值的领域知识表明您的特定用例几乎总是接收浮点值并且性能测试表明您的应用程序表明您的应用程序,那么您自然可以自由地修补它在您希望修补正值地板的情况下,您必须......
2021-03-17 01:11:48
...修改(9<s?':':':0')(10>s?':0':':')(添加 1 个字符但将 6 个真实路径中的 5 个“牺牲”为错误路径)或(10<=s?':':':0')(添加 2 个字符但保留 6 个真实路径中的 5 个)。于是我劝到最后沿变化+s+(s|0) 代替 Math.floor(s),以不破坏的美丽不是需要以决心和电话Math.floor ,同时仍然在正常运行整个53bit+/-MAX_SAFE_INTEGER范围“只是” 32位(无符号)或31bit,而不是(签字)范围内!请注意,ABS(s)magnude 保证小于 60,因此带符号的...
2021-03-20 01:11:48
...按位或签名是安全的。还要注意,这种特殊的修改没有将剩余的秒数打平将使函数输出小数秒而没有尾随小数点零,通常会有超过 3 个重要的非零小数位数字,您可能也需要处理这些数字。最后,当与可选的负范围前缀代码结合使用时,这种特殊的修改将有效地截断秒数(而不是FLOORing它们)。PS: PFFT, whoever came up with just 512 char limit for any meaningful comment should be...
2021-03-21 01:11:48
我建议添加Math.floor(s)到最后一行以获得更清晰的结果。无论如何工作得很好,谢谢!
2021-04-04 01:11:48
@PossessWithin:不,你要不要“Math.floor(S)添加到最后一行”出于多种原因(故障-摘录的),最重要的,因为这将引入一个错误的之间的值9,并10没有进一步的修改; 例如,如果您输入,69.25则输出将1:9代替1:09! 这个函数(我明确指定了整数秒)旨在并精心制作为高性能处理工具/“引擎”(不是忍者高尔夫的大小),因此我认为它适当地给引擎带来了不必要的验证/清理/过滤...
2021-04-10 01:11:48

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(':')
}

@RolandoMurillo 通常,纯函数更好。stackoverflow.com/questions/41625399/...
2021-03-15 01:11:48
@ronapelbaum 是否应该始终将参数视为常量?对于可能遭受突变的非数组/对象文字有时不是很方便吗?
2021-03-24 01:11:48
@ronapelbaum 这个论点,不是常数,我不明白你的意思
2021-03-29 01:11:48
函数参数应被视为常量。当您使用时,%=您正在重新分配此参数。只需使用seconds%60
2021-04-04 01:11:48
嗯,seconds是常量。你不能重新分配它。
2021-04-10 01:11:48

2020 更新

使用基本的数学和简单的 javascript,只需几行代码即可完成。

示例 - 转换7735 secondsHH:MM:SS.


数学:

计算使用:

  1. Math.floor()- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

Math.floor()函数返回小于或等于给定数字的最大整数。

  1. %算术运算符(余数) - 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


领先的零:

许多答案在这里使用复杂的方法来表演几个小时,分钟和秒以适当的方式与领先的零- 4504等,这是可以做到用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
*/

这段代码适用于整数,这是最初的问题。对于小数,您需要进行更多计算。
2021-03-18 01:11:48
不幸的是,您的代码错过了 1 秒,尝试转换 3599.99999998,这将返回 00:59:59,我们该如何解决?
2021-03-21 01:11:48
这太干净了!较早的答案在我的口味中使用了太多的字符串/数组操作。
2021-04-02 01:11:48