【问题标题】:How to convert seconds to minutes and hours in javascript如何在javascript中将秒转换为分钟和小时
【发布时间】:2016-05-08 04:58:11
【问题描述】:

我有一个存储在变量seconds 中的秒数。例如,我想将 1439 秒转换为 23 分 59 秒。如果时间大于 1 小时(例如 9432 秒),则为 2 小时 37 分 12 秒。

我怎样才能做到这一点?

我在想:

var sec, min, hour;

if(seconds<3600){
    var a = Math.floor(seconds/60); //minutes
    var b = seconds%60; //seconds

    if (b!=1){
        sec = "seconds";
    }else{
        sec = "second";
    }

    if(a!=1){
        min = "minutes";
    }else{
        min = "minute";
    }

    $('span').text("You have played "+a+" "+min+" and "+b+" "+sec+".");
}else{
        var a = Math.floor(seconds/3600); //hours
    var x = seconds%3600;
    var b = Math.floor(x/60); //minutes
    var c = seconds%60; //seconds

     if (c!=1){
        sec = "seconds";
    }else{
        sec = "second";
    }

    if(b!=1){
        min = "minutes";
    }else{
        min = "minute";
    }

    if(c!=1){
        hour = "hours";
    }else{
        hour = "hour";
    }

    $('span').text("You have played "+a+" "+hour+", "+b+" "+min+" and "+c+" "+sec+".");
}

但这是很多代码,并且必须每秒计算一次。我怎样才能缩小这个?

【问题讨论】:

  • 我在这里回答了这个问题:how to convert minutes to days,hours,minutes
  • @RomainHippeau 嗨!是的,我的代码有效,但它真的很大,我正在寻找一种方法来缩小它(:
  • 你可以使用一些库,比如dateformat。
  • 您是担心它很大还是很慢?如果是前者,您可以进行一些重构并使用缩小器;如果是后者,它真的不慢:担心每一秒都这样做就像担心你不应该把泡泡糖扔进垃圾桶,因为垃圾场可能会用完空间。
  • @Amadan 如果它不慢那就太好了!我想缩小它,因为它太大了,只是为了让它更紧凑,使用更少的空间,但我不想缩小它。我的速记真的很差,但我的目标是!

标签: javascript


【解决方案1】:

我想你会发现this solution 很有帮助。

您可以使用类似这样的方式修改显示格式以满足您的需求 -

function secondsToHms(d) {
    d = Number(d);
    var h = Math.floor(d / 3600);
    var m = Math.floor(d % 3600 / 60);
    var s = Math.floor(d % 3600 % 60);

    var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
    var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
    var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
    return hDisplay + mDisplay + sDisplay; 
}

【讨论】:

  • 这太棒了!用于获取显示字符串的语句是什么? ('h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : ""')
  • 嗨@BrandonPillay - 不确定你是否研究过,但这些语句是三元运算:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 使用这段代码,传入0返回空字符串,60返回1 minute, ,3600返回1 hour,
  • 我对逗号和时间缩写做了一些调整:function secondsToHms(d) { d = Number(d); var h = Math.floor(d / 3600); var m = Math.floor(d % 3600 / 60); var s = Math.floor(d % 3600 % 60); var hDisplay = h &gt; 0 ? h + (h == 1 ? " hr" : " hrs") + (m &gt; 0 || s &gt; 0 ? ", ":"") : ""; var mDisplay = m &gt; 0 ? m + (m == 1 ? " min" : " mins") + (s &gt; 0 ? ", ":"") : ""; var sDisplay = s &gt; 0 ? s + (s == 1 ? " sec" : " secs") : ""; return hDisplay + mDisplay + sDisplay; }
【解决方案2】:

你可以试试这个,我以前用过这个成功 您应该可以轻松添加分钟和秒数

function secondsToTime(secs)
{
    var hours = Math.floor(secs / (60 * 60));

    var divisor_for_minutes = secs % (60 * 60);
    var minutes = Math.floor(divisor_for_minutes / 60);

    var divisor_for_seconds = divisor_for_minutes % 60;
    var seconds = Math.ceil(divisor_for_seconds);

    var obj = {
        "h": hours,
        "m": minutes,
        "s": seconds
    };
    return obj;
}

Fiddle

您可以将对象更改为

var obj = {
        "h": hours + " hours",
        "m": minutes + " minutes",
        "s": seconds + " seconds"
    };

【讨论】:

    【解决方案3】:

    内置JavaScript Date object可以简化所需代码

     toTime(seconds) {
           var date = new Date(null);
           date.setSeconds(seconds);
           return date.toISOString().substr(11, 8);
        }
    

    【讨论】:

    • 这样好像省了不少代码,用这个方法有没有弊端?为什么首选其他答案?
    • 这必须是选定的答案。不需要任何模块,因为Date 是标准的,它可以进行所要求的精确转换。似乎人们比语言本身更了解 jQuery。
    • 这并没有回答关于如何格式化秒以看起来像 2 hours, 17 minutes, 14 seconds 的操作问题。它甚至不能简单地用于切割碎片,因为生成的02:17:14 字符串将具有前导零(并在 24 小时翻转为全 0)。这是有用的代码,也是解决类似问题的好方法,但如果你来这里是为了寻找 op 正在寻找的东西,这将无济于事
    【解决方案4】:

    一个低脂肪的方法是:

    function seconds_to_days_hours_mins_secs_str(seconds)
    { // day, h, m and s
      var days     = Math.floor(seconds / (24*60*60));
          seconds -= days    * (24*60*60);
      var hours    = Math.floor(seconds / (60*60));
          seconds -= hours   * (60*60);
      var minutes  = Math.floor(seconds / (60));
          seconds -= minutes * (60);
      return ((0<days)?(days+" day, "):"")+hours+"h, "+minutes+"m and "+seconds+"s";
    }
    

    这样

    > seconds_to_days_hours_mins_secs_str(9432+60*60*24)
    '1 days, 2h, 37m and 12s'
    

    这很容易理解并根据需要进行扩展。

    【讨论】:

      【解决方案5】:

      试试这个,将 SEC 转换为 H:M:S。

      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;
      }
      

      【讨论】:

        【解决方案6】:

        我可能有点晚了,但是您可以使用

        来实现这种事情

        https://momentjs.com/

        myVar = moment(myVar).format('HH:mm');

        moment 为小时/日期等提供了很多格式。

        【讨论】:

        • 永远不会太晚,但我绝对认为,根据用例,您可以添加momentjs,但只需为像这样小的东西添加整个库......看起来有点多,不是吗思考。但是是的,它会完成工作
        • moment.js 很棒,但是要格式化秒而不是矩对象,您必须使用moment.duration()。例如:${moment.duration(Number(myVar), 'seconds').hours()}:${moment.duration(Number(myVar), 'seconds').minutes()}:${moment.duration(Number(myVar), 'seconds').seconds()}
        • 这很好,但如果不指定时区,它会加起来抵消我们的时区,所以你应该选择:moment.utc(myVar)...
        • 不要忘记,moment.js 的项目作者本身已广泛不再推荐您使用它:momentjs.com/docs/#/-project-status
        【解决方案7】:

        我发现 Wilson Lee 和 Brian 的代码非常有用!以下是我修改他们的代码的方式:

        function formatTime(serverTimeinSeconds, elementId)
        { /* This converts seconds into days, hours, minutes and seconds timestring.
             Requires JQuery if elementId argument is provided */
          seconds = Math.floor(Number(serverTimeinSeconds));
          days = Math.floor(seconds / (24*60*60));
          seconds -= Math.floor(days    * (24*60*60));
          hours    = Math.floor(seconds / (60*60));
          seconds -= Math.floor(hours   * (60*60));
          minutes  = Math.floor(seconds / (60));
          seconds -= Math.floor(minutes * (60));
        
          dDisplay = days > 0 ? days + (days == 1 ? ' day, ' : ' days, ') : '';
          hDisplay = hours > 0 ? hours + (hours == 1 ? ' hour, ' : ' hours, ') : '';
          mDisplay = minutes > 0 ? minutes + (minutes == 1 ? ' minute, ' : ' minutes, ') : '';
          sDisplay = seconds > 0 ? seconds + (seconds == 1 ? ' second' : ' seconds') : '';
        
          if (elementId != null) {
            if (serverTimeinSeconds < 60) {
                $(elementId).css('font-size', '15px');
                $(elementId).html(sDisplay);
            }
            if (serverTimeinSeconds >= 60 && serverTimeinSeconds < 3600) {
                $(elementId).css('font-size', '15px');
                $(elementId).html(mDisplay + sDisplay);
            }
            if (serverTimeinSeconds >= 3600 && serverTimeinSeconds < 86400) {
                $(elementId).css('font-size', '12px');
                $(elementId).html(hDisplay + mDisplay + sDisplay);
            }
            if (serverTimeinSeconds >= 86400 && serverTimeinSeconds !== Infinity) {
                $(elementId).css('font-size', '8px');
                $(elementId).html(dDisplay + hDisplay + mDisplay + sDisplay);
            }
          }
          return dDisplay + hDisplay + mDisplay + sDisplay;
        }
        

        【讨论】:

          【解决方案8】:
          Please install moment js after that import it,
          
          import moment from 'moment'
          
          let dateForm = (arg) => {
              return moment.unix(arg).utc().format('H [hours,] m [minutes and] s [seconds]');
          }
          
          console.log(dateForm(11));
          // 0 hours, 0 minutes and 11 seconds
          

          console.log(dateForm(16060)); // 1 小时 0 分 0 秒

          【讨论】:

          • 这似乎有点不必要extra
          • 这是完美的答案。我们能不能有一个条件,如果 hours 为 0,则不显示它
          【解决方案9】:

          @pkerckhove 已经提到 moment 是一个很棒的库来处理日期和时间,您也可以使用 moment 直接将秒格式化为 OP 所需的格式,即:

          import moment from 'moment'
          
          const myVar = 1439
          console.log(
              moment.unix(myVar).utc().format('H [hours,] m [minutes and] s [seconds]')
          )
          

          将导致:0 hours, 23 minutes and 59 seconds 和,

          import moment from 'moment'
          
          const myVar = 9432
          console.log(
              moment.unix(myVar).utc().format('H [hours,] m [minutes and] s [seconds]')
          )
          

          将导致:2 hours, 37 minutes and 12 seconds

          【解决方案10】:

          一种方法:

          const formatDuration = totalSeconds => {
            const hours = Math.floor(totalSeconds / 3600)
            const minutes = Math.floor((totalSeconds % 3600) / 60)
            const seconds = totalSeconds - hours * 3600 - minutes * 60
          
            return [`${hours}h`, `${minutes}m`, `${seconds}s`]
              .filter(item => item[0] !== '0')
              .join(' ')
          }
          

          【讨论】:

            【解决方案11】:
             const formatter = (seconds = 0) => {
              const d = Number(secondsAmount);
              const h = Math.floor(d / 3600);
              const m = Math.floor((d % 3600) / 60);
              const s = Math.floor((d % 3600) % 60);
              const hDisplay = h > 0 ? `${h.toString().length > 1 ? `${h}` : `${0}${h}`}` : '00';
              const mDisplay = m > 0 ? `${m.toString().length > 1 ? `${m}` : `${0}${m}`}` : '00';
              const sDisplay = s > 0 ? `${s.toString().length > 1 ? `${s}` : `${0}${s}`}` : '00';
              return `${hDisplay}:${mDisplay}:${sDisplay}`;
            };
            

            将返回此格式人类可读的格式00:00:00

            【讨论】:

              【解决方案12】:

              构建了 R4nc1d 的答案:

              function secondsToTime(secs){
                var h = Math.floor(secs / (60 * 60));
              
                var divisor_for_minutes = secs % (60 * 60);
                var m = Math.floor(divisor_for_minutes / 60);
              
                var divisor_for_seconds = divisor_for_minutes % 60;
                var s = Math.ceil(divisor_for_seconds);
              
                return `${h?`${h}:`:""}${m?`${m}:${s}`:`${s}s`}`
              }
              

              这将返回一个人类可读的答案,如下所示。我用它来显示音乐曲目的长度

              time = secondsToTime(5)   
              console.log(time)         // 5s
              time = secondsToTime(50)  
              console.log(time)         // 50s
              time = secondsToTime(500) 
              console.log(time)         // 8:20
              time = secondsToTime(5000)
              console.log(time)         // 1:23:20
              

              【讨论】:

                【解决方案13】:

                为了获得时间格式“00:00:00”的结果,我对其进行了一些更改。

                function secondsToHms(seconds) {
                
                  let d = Number(seconds);
                
                  if(d <= 0){
                     return '00:00:00'
                  }else{
                    let h = Math.floor(d / 3600);
                    let m = Math.floor(d % 3600 / 60);
                    let s = Math.floor(d % 3600 % 60);
                
                    let hDisplay = h <= 9 ? '0'+ h+':' : h+ ":";
                    let mDisplay = m <= 9 ? '0'+ m+':' : m+ ":";
                    let sDisplay = s <= 9 ? '0'+ s : s;
                
                
                    return hDisplay + mDisplay + sDisplay; 
                
                  }}
                

                【讨论】:

                  【解决方案14】:

                  试试这个:D

                  secondsToHms(d) {
                          d = Number(d);
                          var h = Math.floor(d / 3600);
                          var m = Math.floor(d % 3600 / 60);
                          var s = Math.floor(d % 3600 % 60);
                  
                          var hDisplay = h > 0 ? h + (h == 1 ? "" : "") : "";
                          var mDisplay = m > 0 ? m + (m == 1 ? "" : "") : "";
                          var sDisplay = s > 0 ? s + (s == 1 ? "" : "") : "";
                          if (hDisplay != "") {
                              return (hDisplay.length > 1 ? hDisplay : '0' + hDisplay) + ":" + (mDisplay.length > 1 ? mDisplay : '0' + mDisplay) + ":" + (sDisplay.length > 1 ? sDisplay : '0' + sDisplay);
                          }
                          else if (mDisplay != "") {
                              return (mDisplay.length > 1 ? mDisplay : '0' + mDisplay) + ":" + (sDisplay.length > 1 ? sDisplay : '0' + sDisplay);
                          }
                          else if (sDisplay != "") {
                              return "00:" + (sDisplay.length > 1 ? sDisplay : '0' + sDisplay);
                          }
                          return "00:00"
                      }
                  

                  【讨论】:

                    【解决方案15】:

                    使用流行的date-fns

                    import { format, setSeconds, startOfDay } from 'date-fns'
                    
                    export const hourMinSec = (secs: number, showHour = false): string => {
                    
                      const tmpDate: Date = startOfDay(new Date())
                      const date: Date = setSeconds(tmpDate, secs)
                      const hour: number = date.getHours()
                      const hasHour: boolean = !!hour
                    
                      if (hasHour && !showHour) console.warn('hourMinSec is hiding a non zero hour')
                    
                      const strFormat: string = showHour ? 'H:mm:ss' : 'm:ss'
                      return format(date, strFormat)
                    }
                    

                    或使用更实用的方法(在混合中添加 lodash 流)使用相同的代码

                    import { setSeconds, startOfDay } from 'date-fns/fp'
                    import { format } from 'date-fns'
                    import { flow } from 'lodash-es'
                    
                    export const hourMinSec = (secs: number, showHour = false): string => {
                      const date: Date = flow(startOfDay, setSeconds(secs))(new Date())
                      const hour: number = date.getHours()
                      const hasHour: boolean = !!hour
                    
                      if (hasHour && !showHour) console.warn('hourMinSec is hiding a non zero hour')
                    
                      const strFormat: string = showHour ? 'H:mm:ss' : 'm:ss'
                      return format(date, strFormat)
                    }
                    

                    用法:

                    hourMinSec(100)         //    1:40
                    hourMinSec(3700)        //    1:40 // will warn in logs that a non zero hour is hidden
                    hourMinSec(100, true)   // 0:01:40
                    hourMinSec(3700, true)  // 1:01:40
                    

                    这满足了我的需求,但您可以通过将 showHour = false 参数更改为 strFormat = 'm:ss' 参数来适应这一点,以支持更灵活的格式。

                    【讨论】:

                      【解决方案16】:
                      const minutes = Math.floor(duration / 60);
                      const seconds = Math.floor(duration - minutes * 60);
                      
                      const time = `${minutes < 10 ? `0${minutes}` : minutes}
                                   :${seconds < 10 ? `0${seconds}` : seconds}`; // result: 02:23
                      

                      【讨论】:

                      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:stackoverflow.com/help/how-to-answer。祝你好运?
                      【解决方案17】:

                      此方法也适用于负时间:

                      function CalculateTime(sec){
                      
                          if(sec >= 0){
                              var h = Math.floor(sec / 3600);
                          var m = Math.floor(sec % 3600 / 60);
                          var s = Math.floor(sec % 3600 % 60);
                          }
                          else{
                              var h = Math.ceil(sec / 3600);
                          var m = Math.ceil(sec % 3600 / 60);
                          var s = Math.ceil(sec % 3600 % 60);
                          }
                      
                          var hDisplay = h !== 0 ? h + (h == 1 ? " hour, " : " hours") + (m != 0 || s > 0 ? ", ":"") : "";
                          var mDisplay = m !== 0 ? m + (m == 1 ? " minute, " : " minutes")  + (s != 0 ? " ":""): "";
                          var sDisplay = s !== 0 ? s + (s == 1 ? " second" : " seconds") : "";
                          return hDisplay + mDisplay + sDisplay; 
                      }
                      

                      【讨论】:

                        【解决方案18】:

                        转换为 H:M

                        Number(moment.duration(Number(37320), 'seconds').hours()+'.'+moment.duration(Number(37320),'seconds').minutes())
                        

                        【讨论】:

                          猜你喜欢
                          • 2014-10-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-06-02
                          • 1970-01-01
                          相关资源
                          最近更新 更多