仅在javascript中将HH:MM:SS字符串转换为秒


97

我有与此类似的要求:将HH:MM:SS格式的时间仅转换为秒?

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


哎呀..对不起错字。是的,时间到了hh:mm:ss
Sri Reddy

什么是DDHH:MM:DD
Brian Driscoll 2012年

2
它与该PHP问题中的算法相同。
scottheckel 2012年

好.. H(小时)== 3600秒,M(分钟)== 60秒.....
MilkyWayJoe 2012年

1
我想到的唯一解决方案是将字符串拆分为数组,然后将3600乘以小时,再乘以60乘以min,然后加上秒。这是最简单的解决方案吗?
Sri Reddy 2012年

Answers:


192

试试这个:

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

3
这是此的原型版本!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的(仍然有效)时间表示形式出现问题(当seconds = 0时,Chrome type =“ time”输入将以这种格式输出)。
法塔赫·哈尔萨

很棒的东西伙计
爱德华

我只有hh:mm没有seconds在这种情况下,我不得不修改..?
全球先生

1
:@AbdulWaheed更改此行var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova

4
使用“ +”运算符将数字字符串转换为数字不是一个好主意。它很短,看上去很“聪明”,但是令人困惑,而且代码也不干净。请改用parseInt(x,10)。并避免单线。还可以通过未定义的输入防止错误。例如:它不是字符串,没有“:”或只有“ HH:MM”。等
Dominik

67

此功能处理“ 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;
}

很好,如果通过时间的要求是任何格式,我将保留它。谢谢!
斯里·雷迪

到目前为止对我来说最好的答案
Rezwan Azfar Haleem

这个答案很有用
Mike Aron

我需要更改功能以仅以'HH:MM'格式使用的内容
noyruto88 '19

35

可以通过以下方式相当灵活地完成此操作:

'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
是的,它很聪明,但却是创建难以维护的代码而没有实际收获的一个很好的例子。缩小后的版本比接受的答案的缩小版节省4个字符。鉴于许多网页现在已超过1MB,因此节省下来的金额微不足道。
RobG '18年

4
尽管此答案不那么容易理解,但它可以HH:MM:SS很好地处理以及MM:SS,而不能接受。
ckeeney

1
如果仅提供秒部分,则此程序有类型转换错误。您需要使用0显式初始化备忘以防止备忘。Works:'03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);因返回意外字符串而失败:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz

@FelixGertz很好,我将为这种情况编辑一个修复程序。
保罗

12

由于Date对象的getTime函数从1970/01/01开始获取毫秒数,因此我们可以这样做:

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

1
刚刚意识到,这与夏令时不起作用。需要使用实际日期
Yablargo 2013年

1
@Yablargo谢谢。以前的版本无法与本地时区很好地兼容,因此我对其进行了编辑,以使用iso 8601 utc datetime格式。
boskop

12

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)

4
请解释您的答案
B001ᛦ2016年

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

@CMR,有趣的方法,但是如果mm:ss不能正常工作。
Paul Hide

Math.pow非常慢,可以像其他基于reduce的答案所示那样避免
Alejadro Xalabarder

8

尝试

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

5
啊,* 1是一种使其不进行字符串连接的聪明方法:)
Dagg Nabbit 2012年

5

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

4

这可能是原始批准答案上更具可读性的表格。

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

2
new Date(moment('23:04:33', "HH:mm")).getTime()

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

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


OP要求秒而不是毫秒
user7294900

嗨,user7294900,谢谢您的评论,我将更新我的回答,我们需要除以1000
ITsDEv

1

此功能也适用于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])
        }
      }


1

取自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);
}

0

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>')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


0

您可以动态地执行此操作-如果不仅遇到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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.