【问题标题】:Converting milliseconds to minutes and seconds with Javascript使用 Javascript 将毫秒转换为分钟和秒
【发布时间】:2014-02-13 04:22:28
【问题描述】:

Soundcloud 的 API 以毫秒为单位给出其曲目的持续时间。 JSON 看起来像这样:

"duration": 298999

我尝试了很多在这里找到的功能,但都无济于事。我只是在寻找可以将该数字转换为如下所示的东西:

4:59

这是一个接近但不起作用的方法。它不会在 60 秒处停止。它一直到 99 秒,这没有任何意义。例如,尝试输入“187810”作为 ms 的值。

var ms = 298999,
min = Math.floor((ms/1000/60) << 0),
sec = Math.floor((ms/1000) % 60);

console.log(min + ':' + sec);

感谢您的帮助!

如果您也可以添加几个小时的支持,我将不胜感激。

【问题讨论】:

  • 一直到 99”是什么意思?你的脚本对我有用,正确输出4:58。请提供导致意外输出的输入。
  • 187810 是它不起作用的一个例子。一直到 99。一分钟没有 99 秒。
  • 这对我来说产生了3:7(也许应该是3:07)。你在哪里看到 99?
  • 我不知道,我复制了这段代码,Bergi。
  • 在这里,自从我复制以来,将 Math.floor 添加到其中。 stackoverflow.com/questions/5588465/…

标签: javascript milliseconds seconds


【解决方案1】:

小时,0-填充分钟和秒:

var ms = 298999;
var d = new Date(1000*Math.round(ms/1000)); // round to nearest second
function pad(i) { return ('0'+i).slice(-2); }
var str = d.getUTCHours() + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds());
console.log(str); // 0:04:59

【讨论】:

  • 在某些用例中,最好删除第二 (2nd) 行(四舍五入到最接近的秒数)。例如,如果我们想知道还剩多少秒,这将返回“4:58”。
  • 大概如果你超过 60 分钟你想添加getUTCHours
  • @Madbreaks 如果您建议 pad 正在重新发明轮子,请注意答案来自 2014 年,但您对 padStart 的使用是 EMCAScript 2017 的一部分。
  • @Matt 我的错。我删除了我之前的评论。我建议尽可能使用原生 JS 类/函数。
【解决方案2】:
function millisToMinutesAndSeconds(millis) {
  var minutes = Math.floor(millis / 60000);
  var seconds = ((millis % 60000) / 1000).toFixed(0);
  return minutes + ":" + (seconds < 10 ? '0' : '') + seconds;
}

millisToMinutesAndSeconds(298999); // "4:59"
millisToMinutesAndSeconds(60999);  // "1:01"

正如用户HelpingHand 在 cmets 中指出的那样,return 语句应该是:

return (
  seconds == 60 ?
  (minutes+1) + ":00" :
  minutes + ":" + (seconds < 10 ? "0" : "") + seconds
);

【讨论】:

  • 让我们知道,当接近转换到下一分钟时,此解决方案有时会导致第二个 60 秒(例如1:60)。我通过在最后一行添加一个内联 if 语句来阻止这种情况的发生:return (seconds == 60 ? (minutes+1) + ":00" : minutes + ":" + (seconds &lt; 10 ? "0" : "") + seconds); 您可以在操作中看到它here
  • HelpHand 提出了一个很好的观点 - 您可以通过运行 millisToMinutesAndSeconds(299900) 来重现该问题
  • return 应该是返回分钟 + ":" + seconds.ToString("00"),其中秒应该是 (Math.Round(millis % 60000 / 1000, 0, MidpointRounding.ToEven);
  • 此函数重命名的建议:formatToISODuration ... 不要在意名称中的毫秒,参数就可以了。并且总是写用户 PoV 名称,没有内部技术细节。在函数名中加上“And”总是一个坏主意。
【解决方案3】:

可能有更好的方法来做到这一点,但它可以完成工作:

var ms = 298999;
var min = ms / 1000 / 60;
var r = min % 1;
var sec = Math.floor(r * 60);
if (sec < 10) {
    sec = '0'+sec;
}
min = Math.floor(min);
console.log(min+':'+sec);

不知道为什么您的分钟行中有

用 % 获取剩余的分钟数可以得到该分钟所用秒数的百分比,因此将它乘以 60 可以得到秒数,下限使它更适合显示,尽管你也可以得到亚秒如果需要,可以精确。

如果秒数小于 10,您希望以前导零显示它们。

【讨论】:

    【解决方案4】:

    虽然事件,oment.js 并没有提供这样的功能,但是如果你来到这里并且已经在使用 moment.js,试试这个:

    function formatDuration(ms) {
      var duration = moment.duration(ms);
      return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
    }
    

    你会得到类似 x:xx:xx 的东西。

    如果您可能想跳过小时,而持续时间仅为

    function formatDuration(ms) {
      var duration = moment.duration(ms);
      if (duration.asHours() > 1) {
        return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
      } else {
        return moment.utc(duration.asMilliseconds()).format("mm:ss");
      }
    }
    

    这个解决方法是在这个Issue 中介绍的。

    【讨论】:

      【解决方案5】:

      如果您想在 1:02:32.21 等秒后显示小时、厘秒或毫秒,此代码会做得更好 如果在手机中使用,即使在屏幕锁定后,计时器也会显示正确的时间。

      <div id="timer" style="font-family:monospace;">00:00<small>.00</small></div>
      
      <script>
      var d = new Date();
      var n = d.getTime();
      var startTime = n;
      
      var tm=0;
      function updateTimer(){
        d = new Date();
        n = d.getTime();
        var currentTime = n;  
        tm = (currentTime-startTime);
        
        //tm +=1; 
        // si el timer cuenta en centesimas de segundo
        //tm = tm*10;
        
        var hours = Math.floor(tm / 1000 / 60 / 60);
        var minutes = Math.floor(tm / 60000) % 60;
        var seconds =  ((tm / 1000) % 60);
        // saca los decimales ej 2 d{0,2}
        var seconds = seconds.toString().match(/^-?\d+(?:\.\d{0,-1})?/)[0];
        var miliseconds = ("00" + tm).slice(-3);
        var centiseconds;
      
        
        // si el timer cuenta en centesimas de segundo
        //tm = tm/10;
      
      
        centiseconds = miliseconds/10;
        centiseconds = (centiseconds).toString().match(/^-?\d+(?:\.\d{0,-1})?/)[0];
      
        minutes = (minutes < 10 ? '0' : '') + minutes;
        seconds = (seconds < 10 ? '0' : '') + seconds;
        centiseconds = (centiseconds < 10 ? '0' : '') + centiseconds;
        hours = hours + (hours > 0 ? ':' : '');
        if (hours==0){
          hours='';
        }
      
        document.getElementById("timer").innerHTML = hours + minutes + ':' + seconds + '<small>.' + centiseconds + '</small>';
      }
      
      var timerInterval = setInterval(updateTimer, 10);
      // clearInterval(timerInterval);
      </script>

      【讨论】:

      • 你的回答还不错。大多是题外话。问题是关于格式化,而不是关于显示,也不是关于更新时间。代码中也存在一些问题。由于缺乏分离(混合格式与更新),代码并不是真正可重用的。您还计算了两次seconds 并使用低效的方法进行计算(RegExp)...
      • 嗨 Nux 谢谢,我明白了,当需要在 arduino 提供的 Web 应用程序中显示时间时遇到了这个问题,js 代码只在客户端运行一次,并不意味着扩展。顶部答案中的时间计算实际上不起作用。 secconds/100 在运行时与秒不匹配,如果浏览器失去焦点,计时器就会失去计数。如果您尝试我的代码,它涵盖了有关计算、格式化和显示的所有需求,当然,如果您可以使其可重用和高性能,请将 sn-p 发送给我。谢谢!
      【解决方案6】:

      如果寻找,这是我的贡献

      h:mm:ss

      而不是像我一样:

      function msConversion(millis) {
        let sec = Math.floor(millis / 1000);
        let hrs = Math.floor(sec / 3600);
        sec -= hrs * 3600;
        let min = Math.floor(sec / 60);
        sec -= min * 60;
      
        sec = '' + sec;
        sec = ('00' + sec).substring(sec.length);
      
        if (hrs > 0) {
          min = '' + min;
          min = ('00' + min).substring(min.length);
          return hrs + ":" + min + ":" + sec;
        }
        else {
          return min + ":" + sec;
        }
      }
      

      【讨论】:

        【解决方案7】:

        这是最好的!

        function msToTime(duration) {
        var milliseconds = parseInt((duration%1000))
            , seconds = parseInt((duration/1000)%60)
            , minutes = parseInt((duration/(1000*60))%60)
            , hours = parseInt((duration/(1000*60*60))%24);
        
        hours = (hours < 10) ? "0" + hours : hours;
        minutes = (minutes < 10) ? "0" + minutes : minutes;
        seconds = (seconds < 10) ? "0" + seconds : seconds;
        
        return hours + ":" + minutes + ":" + seconds + "." + milliseconds;
        }
        

        它将返回 00:04:21.223 然后,您可以根据需要格式化此字符串。

        【讨论】:

        • 无需重新发明轮子。查看Date 类及其为您提供的方法。 “最好的”总是使用原生解决方案。
        • @Madbreaks 我不确定您将如何使用日期进行这样的纯格式设置,因为您必须处理时区。你能提供一个例子来说明你的意思吗?
        • @ianstarz 我添加了答案。
        【解决方案8】:

        正常工作:

        const minute = Math.floor(( milliseconds % (1000 * 60 * 60)) / (1000 * 60));
        
        const second = Math.floor((ms % (1000 * 60)) / 1000);
        

        【讨论】:

          【解决方案9】:
          function msToHMS( ms ) {
            // 1- Convert to seconds:
            var seconds = ms / 1000;
          
            // 2- Extract hours:
            var hours = parseInt( seconds / 3600 ); // 3,600 seconds in 1 hour
            seconds = seconds % 3600; // seconds remaining after extracting hours
          
            // 3- Extract minutes:
            var minutes = parseInt( seconds / 60 ); // 60 seconds in 1 minute
          
            // 4- Keep only seconds not extracted to minutes:
            seconds = seconds % 60;
          
            //alert( hours+":"+minutes+":"+seconds);
            hours = (hours < 10) ? "0" + hours : hours;
            minutes = (minutes < 10) ? "0" + minutes : minutes;
            seconds = (seconds < 10) ? "0" + seconds : seconds;
            var hms = hours+":"+minutes+":"+seconds;
            return hms;
          }
          

          【讨论】:

            【解决方案10】:
            const Minutes = ((123456/60000).toFixed(2)).replace('.',':');
            
            //Result = 2:06
            

            我们将以毫秒为单位的数字 (123456) 除以 60000,得到相同的以分钟为单位的数字,此处为 2.0576。

            toFixed(2) - 将数字四舍五入到最接近的两位小数,在本例中给出的答案为 2.06。

            然后您使用替换将句点换成冒号。

            【讨论】:

              【解决方案11】:

              我的解决方案: 输入:11381(以毫秒为单位) 输出:00:00:11.381

               timeformatter(time) {
                  console.log(time);
              
                  let miliSec = String(time%1000);
                  time = (time - miliSec)/1000;
                  let seconds = String(time%60);
                  time = (time - seconds)/60;
                  let minutes = String(time%60);
                  time = (time-minutes)/60;
                  let hours = String(time)
              
                  while(miliSec.length != 3 && miliSec.length<3 && miliSec.length >=0) {
                      miliSec = '0'+miliSec;
                  }
                  while(seconds.length != 2 && seconds.length<3 && seconds.length >=0) {
                      seconds = '0'+seconds;
                  }
                  while(minutes.length != 2 && minutes.length<3 && minutes.length >=0) {
                      minutes = '0'+minutes;
                  }
                  while(hours.length != 2 && hours.length<3 && hours.length >=0) {
                      hours = '0'+hours;
                  }
                  return `${hours}  : ${minutes} : ${seconds}.${miliSec}`
              }
              

              【讨论】:

              • 不需要将数字转换为字符串
              【解决方案12】:

              我不太确定为什么这些答案都如此复杂。 Date 类为您提供所需的内容:

              const date = new Date(298999);
              
              alert(`${date.getMinutes()}:${date.getSeconds()}`);

              虽然上述内容符合 op 的要求,但添加此更新版本以响应 @ianstarz 关于时区独立性的评论:

              const d = new Date(Date.UTC(0,0,0,0,0,0,298999)),
                // Pull out parts of interest
                parts = [
                  d.getUTCHours(),
                  d.getUTCMinutes(),
                  d.getUTCSeconds()
                ],
                // Zero-pad
                formatted = parts.map(s => String(s).padStart(2,'0')).join(':');
              
              alert(formatted);

              【讨论】:

              • 看起来 OP 确实只要求秒和分钟。但是,此解决方案将无法工作数小时和数天。 date.getHours() // =&gt; 16(在我的时区)
              • @ianstarz 更新了我的解决方案,使其更普遍适用
              • 应该在列表的前面,但是如果秒数 4:5
              • @Tunn 更新了一个更完整的例子
              • @Madbreaks 你可能也想在你的第一个例子中这样做,否则简单会误导
              猜你喜欢
              • 2012-09-27
              • 2018-11-16
              • 1970-01-01
              • 2013-01-12
              • 2013-07-11
              • 2017-05-08
              • 2020-09-04
              • 2016-06-29
              相关资源
              最近更新 更多