【问题标题】:Convert HH:MM:SS string to seconds only in javascript仅在 javascript 中将 HH:MM:SS 字符串转换为秒
【发布时间】:2012-03-27 06:29:24
【问题描述】:

我有类似的要求:Convert time in HH:MM:SS format to seconds only?

但在 javascript 中。我见过许多将秒转换为不同格式的示例,但没有将 HH:MM:SS 转换为秒。任何帮助,将不胜感激。

【问题讨论】:

  • 哎呀..抱歉错字。是的,是时候了 hh:mm:ss
  • HH:MM:DD 中的DD 是什么?
  • 这与 PHP 问题中的算法相同。
  • 嗯.. H(小时)== 3600 秒,M(分钟)== 60 秒...所以..
  • 我想到的唯一解决方案是将字符串拆分为数组,然后将 3600 乘以小时,然后将 60 乘以分钟,然后加上秒部分。这是最简单的解决方案吗?

标签: javascript time


【解决方案1】:

试试这个:

var hms = '02:04:33';   // your input string
var a = hms.split(':'); // split it at the colons

// minutes are worth 60 seconds. Hours are worth 60 minutes.
var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 

console.log(seconds);

【讨论】:

  • 这是一个原型版本! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } 注意:结尾处的 || 0 适用于此代码的任何实现 - 它可以防止 HH:MM 的(仍然有效的)时间表示出现问题(Chrome type="time" 输入将在以下情况下以这种格式输出)秒=0)。
  • 很棒的东西,伙计
  • 我只有hh:mm 而不是seconds 在这种情况下我必须修改什么..?
  • @AbdulWaheed 将此行更改:​​var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
  • 使用“+”运算符将数字字符串转换为数字不是一个好主意。它很短,看起来“聪明”,但它令人困惑且代码不干净。请改用 parseInt(x, 10)。并避免单线。还可以通过未定义的输入防止错误。例如:它不是字符串,没有“:”或只有“HH:MM”。等
【解决方案2】:

此函数处理“HH:MM:SS”以及“MM:SS”或“SS”。

function hmsToSecondsOnly(str) {
    var p = str.split(':'),
        s = 0, m = 1;

    while (p.length > 0) {
        s += m * parseInt(p.pop(), 10);
        m *= 60;
    }

    return s;
}

【讨论】:

  • 很好,如果出现任何格式的时间要求,我会保留它。谢谢!
  • 目前为止对我来说最好的答案
  • 这个答案很有用
  • 我需要在您的函数中更改哪些内容才能仅以 'HH:MM' 格式使用
  • @Niko 我的时间输入是“2 h 10 m”格式。如何将其转换为秒?
【解决方案3】:

这可以通过以下方式非常有弹性地完成:

'01:02:03'.split(':').reduce((acc,time) => (60 * acc) + +time);

这是因为小时、分钟和秒内的每个时间单位都比较小的单位大 60 倍。时间分为小时、分钟和秒部分,然后通过使用较高单位的累积值乘以 60 来减少到秒,因为它通过每个单位。

+time 用于将时间转换为数字。

它基本上结束了:(60 * ((60 * HHHH) + MM)) + SS

如果只传递了秒,那么结果将是一个字符串,因此我们可以将整个结果转换为一个 int:

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));

【讨论】:

  • 这实际上非常聪明......问题是这与计算相比有多快
  • 是的,它很聪明,但是创建难以维护的代码却没有实际收益的一个很好的例子。缩小与接受答案的缩小版本相比,它可以节省 4 个字符。鉴于现在许多网页都超过了 1MB,因此节省的空间不是微不足道的。
  • 虽然这个答案不是那么容易理解,但它确实可以很好地处理HH:MM:SSMM:SS,而接受的答案却没有。
  • 这个有一个类型转换错误,如果只给出秒部分。您需要使用 0 显式初始化备忘录以防止它发生。工作:'03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0); 失败,因为返回一个意外的字符串:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
  • @KhadijaDaruwala 您可以通过分隔符 (space) '2 h 10 m'.split(' ') 拆分字符串以使其成为一个数组,访问正确的偏移量,乘以单位(一小时内的秒数,一分钟内的秒数) , 并添加。
【解决方案4】:

由于 Date 对象的getTime 函数获取自 1970/01/01 以来的毫秒数,我们可以这样做:

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;

【讨论】:

  • 刚刚意识到,这不适用于夏令时。需要使用实际日期
  • @Yablargo 谢谢。以前的版本不适用于本地时区,因此我将其编辑为使用 iso 8601 utc 日期时间格式。
【解决方案5】:

在一行中将hh:mm:ss 字符串转换为秒。也允许h:m:s格式和mm:ssm:s

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)

【讨论】:

  • 请解释一下你的答案
  • 在一行中将hh:mm:ss 字符串转换为秒。还允许h:m:s 格式和mm:ssm:s 等。
  • 不错的答案!但是你可以跳过reverse(): '00:01:11'.split(':').reduce((val, entry, i) => val + entry * (3600/Math.pow(60, i) ), 0) === 71
  • @CMR,有趣的方法,但如果是mm:ss,它将无法正常工作。
  • Math.pow 非常慢,可以避免,如基于 reduce 的其他答案所示
【解决方案6】:

试试

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;

【讨论】:

  • 啊,那 *1 是让它不进行字符串连接的聪明方法:)
【解决方案7】:

Javascript 的静态方法 Date.UTC() 可以解决问题:

alert(getSeconds('00:22:17'));

function getSeconds(time)
{
    var ts = time.split(':');
    return Date.UTC(1970, 0, 1, ts[0], ts[1], ts[2]) / 1000;
}

【讨论】:

    【解决方案8】:

    这可能是原始批准答案的更易读的形式。

    const getSeconds = (hms: string) : number => {
      const [hours, minutes, seconds] = hms.split(':');
      return (+hours) * 60 * 60 + (+minutes) * 60 + (+seconds);
    };
    

    【讨论】:

      【解决方案9】:

      这是最清晰易懂的解决方案:

      function convertDurationtoSeconds(duration){
          const [hours, minutes, seconds] = duration.split(':');
          return Number(hours) * 60 * 60 + Number(minutes) * 60 + Number(seconds);
      };
      
      const input = '01:30:45';
      const output = convertDurationtoSeconds(input);
      console.log(`${input} is ${output} in seconds`);

      【讨论】:

      • 我的时间输入是 '2 h 10 m' 格式。如何将其转换为秒?
      【解决方案10】:
      new Date(moment('23:04:33', "HH:mm")).getTime()
      

      输出: 1499755980000(以毫秒为单位) (1499755980000/1000)(秒)

      注意:此输出计算从 1970-01-01 12:0:0 到现在的差异 我们需要实现 moment.js

      【讨论】:

      • OP 要求秒而不是毫秒
      • 您好 user7294900,谢谢您的评论,我会更新我的答案,我们需要除以 1000
      【解决方案11】:

      这个函数也适用于 MM:SS:

      const convertTime = (hms) => {
              if (hms.length <3){
               return hms
              } else if (hms.length <6){
                const a = hms.split(':')
                return hms = (+a[0]) * 60 + (+a[1])
              } else {
                const a = hms.split(':')
                return hms = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2])
              }
            }

      【讨论】:

        【解决方案12】:

        取自 Paul https://stackoverflow.com/a/45292588/1191101 给出的解决方案,但使用旧的函数表示法,因此它也可以用于其他 js 引擎(例如 java Rhino)

        function strToSeconds (stime)
        {
           return +(stime.split(':').reduce(function (acc,time) { return +(60 * acc) + +time }));
        }
        

        或者只是这个更具可读性

        function strToSeconds (stime)
        {
          var tt = stime.split(':').reverse ();
          return ((tt.length >= 3) ? (+tt[2]): 0)*60*60 + 
                 ((tt.length >= 2) ? (+tt[1]): 0)*60 + 
                 ((tt.length >= 1) ? (+tt[0]): 0);
        }
        

        【讨论】:

          【解决方案13】:

          function parsehhmmsst(arg) {
          	var result = 0, arr = arg.split(':')
          	if (arr[0] < 12) {
          		result = arr[0] * 3600 // hours
          	}
          	result += arr[1] * 60 // minutes
          	result += parseInt(arr[2]) // seconds
          	if (arg.indexOf('P') > -1) {  // 8:00 PM > 8:00 AM
          		result += 43200
          	}
          	return result
          }
          $('body').append(parsehhmmsst('12:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('1:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('2:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('3:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('4:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('5:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('6:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('7:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('8:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('9:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('10:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('11:00:00 AM') + '<br>')
          $('body').append(parsehhmmsst('12:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('1:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('2:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('3:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('4:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('5:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('6:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('7:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('8:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('9:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('10:00:00 PM') + '<br>')
          $('body').append(parsehhmmsst('11:00:00 PM') + '<br>')
          &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

          【讨论】:

            【解决方案14】:

            您可以动态执行此操作 - 万一您遇到的不仅是:HH:mm:ss,还有 mm:ss,甚至是单独的 ss。

            var str = '12:99:07';
            var times = str.split(":");
            times.reverse();
            var x = times.length, y = 0, z;
            for (var i = 0; i < x; i++) {
                z = times[i] * Math.pow(60, i);
                y += z;
            }
            console.log(y);
            

            【讨论】:

              猜你喜欢
              • 2011-06-04
              • 1970-01-01
              • 2019-08-07
              • 1970-01-01
              • 2018-07-11
              • 1970-01-01
              • 2015-07-06
              • 1970-01-01
              相关资源
              最近更新 更多