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

IT技术 javascript time
2021-01-13 07:50:35

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

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

6个回答

试试这个:

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);
厉害的东西哥们
2021-03-19 07:50:35
我只是hh:mm没有seconds在这种情况下我必须修改什么..?
2021-03-19 07:50:35
这是它的原型版本!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" 输入将在 seconds=0 时以这种格式输出)。
2021-04-01 07:50:35
使用“+”运算符将数字字符串转换为数字不是一个好主意。它很短,看起来很“聪明”,但它很混乱,而且代码不干净。使用 parseInt(x, 10) 代替。并避免单线。还可以防止未定义输入的错误。例如:它不是字符串,没有“:”或只有“HH:MM”。等等。
2021-04-07 07:50:35
@AbdulWaheed改变这一行:var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
2021-04-09 07:50:35

此函数处理“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”格式使用
2021-03-12 07:50:35
到目前为止对我来说最好的答案
2021-03-15 07:50:35
很好,如果时间过去了需要任何格式,我会保留它。谢谢!
2021-03-30 07:50:35
这个答案很有用
2021-04-05 07:50: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));
尽管这个答案不太容易理解,但它确实HH:MM:SS很好地处理了MM:SS,而接受的答案却没有。
2021-03-14 07:50:35
那实际上非常聪明……问题是这与计算相比有多快
2021-03-16 07:50:35
这个有一个类型转换错误,如果只给出了秒部分。您需要使用 0 显式初始化备忘录以防止它。工作:'03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);失败,因为返回一个意外的字符串:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
2021-03-16 07:50:35
是的,这很聪明,但它是创建难以维护的代码而没有实际收益的好例子。缩小与缩小版本的接受答案相比,它可以节省 4 个字符。鉴于现在许多网页都超过了 1MB,因此节省的空间比微不足道的要小得多。
2021-03-24 07:50:35
@FelixGertz 发现得很好,我将针对这种情况进行修复。
2021-04-06 07:50:35

由于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 日期时间格式。
2021-03-21 07:50:35
刚刚意识到,这不适用于夏令时。需要使用实际日期
2021-03-25 07:50:35

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)
不错的答案!但是你可以跳过reverse(): '00:01:11'.split(':').reduce((val, entry, i) => val + entry * (3600/Math.pow(60, i)), 0 ) === 71
2021-03-14 07:50:35
hh:mm:ss在一行中将字符串转换为秒。也让h:m:s格式mm:ssm:s等等。
2021-03-19 07:50:35
Math.pow 非常慢,可以避免,如其他基于 reduce 的答案所示
2021-03-23 07:50:35
请解释你的答案
2021-04-07 07:50:35
@CMR,有趣的方法,但万一mm:ss它无法正常工作。
2021-04-08 07:50:35