Converter string HH: MM: SS em segundos apenas em javascript

97

Estou tendo um requisito semelhante a este: Converter o tempo no formato HH: MM: SS para apenas segundos?

mas em javascript. Tenho visto muitos exemplos de conversão de segundos em formatos diferentes, mas não HH: MM: SS em segundos. Qualquer ajuda seria apreciada.

Sri Reddy
fonte
oops .. desculpe pelo erro de digitação. sim, está na hora hh: mm: ss
Sri Reddy,
O que está DDdentro HH:MM:DD?
Brian Driscoll,
2
É o mesmo algoritmo daquela questão sobre PHP.
scottheckel,
Bem .. H (hora) == 3600 segundos, M (minuto) == 60 segundos ... então ..
MilkyWayJoe
1
A única solução que penso é dividir a string em array e, em seguida, multiplicar 3600 por hora e 60 por minuto e adicionar tudo com a parte dos segundos. Esta é a solução mais simples?
Sri Reddy,

Respostas:

192

Experimente isto:

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);
Dagg Nabbit
fonte
3
Aqui está uma versão de protótipo disso! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } NOTA: || 0no final é bom para qualquer implementação deste código - ele evita problemas com uma representação de tempo (ainda válida) de HH: MM (tipo de Chrome = "tempo" as entradas serão geradas neste formato quando segundos = 0).
Fateh Khalsa
Coisa incrível cara
edward
eu só hh:mmnão tenho secondsneste caso o que devo modificar ..?
Sr. mundial
1
@AbdulWaheed Altere esta linha: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); paravar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova
4
O uso do operador "+" para converter string numérica em número não é uma boa ideia. É curto e parece "inteligente", mas é confuso e não é um código limpo. Use parseInt (x, 10) em vez disso. E evite uma linha curta. Também evita erros por entrada indefinida. Por exemplo: não é uma string, não tem ":" ou apenas "HH: MM". etc.
Dominik
67

Esta função manipula "HH: MM: SS", bem como "MM: SS" ou "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;
}
Niko
fonte
Legal, vou mantê-lo se houver necessidade de o tempo passado em qualquer formato. Obrigado!
Sri Reddy,
Melhor resposta para mim até agora
Rezwan Azfar Haleem
Esta resposta é útil
Mike Aron
O que eu preciso mudar em sua função para usar somente no formato 'HH: MM'
noyruto88
35

Isso pode ser feito de forma bastante resiliente com o seguinte:

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

Isso ocorre porque cada unidade de tempo dentro das horas, minutos e segundos é um múltiplo de 60 maior do que a unidade menor. O tempo é dividido em componentes de hora, minutos e segundos, e então reduzido para segundos usando o valor acumulado das unidades mais altas multiplicado por 60 à medida que passa por cada unidade.

O +timeé usado para converter o tempo para um número.

Basicamente, acaba fazendo: (60 * ((60 * HHHH) + MM)) + SS

Se apenas segundos forem passados, o resultado será uma string, para corrigir isso podemos converter todo o resultado para um int:

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));
Paulo
fonte
isso é realmente muito inteligente .. a questão é quão rápido isso é comparado a um cálculo
ThatBrianDude
4
Sim, é inteligente, mas um bom exemplo de criação de código difícil de manter sem ganho prático. Ele salva 4 caracteres quando reduzido em comparação com uma versão reduzida da resposta aceita. Dado que muitas páginas da Web agora têm mais de 1 MB, essa economia é um pouco menos do que insignificante.
RobG
4
Embora essa resposta não seja tão compreensível, ela lida HH:MM:SSperfeitamente com ambos MM:SS, enquanto a resposta aceita não.
ckeeney
1
Este tem um bug de conversão de tipo, se houver apenas a parte dos segundos é fornecida. Você precisa inicializar explicitamente o memo com 0 para evitá-lo. Funciona: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);falha porque retorna uma string inesperada:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz
@FelixGertz Bem localizado, vou editar uma correção para esse caso.
Paul
12

Como a função getTime do objeto Date obtém os milissegundos desde 01/01/1970, podemos fazer isso:

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;
Boskop
fonte
1
Acabei de perceber que isso não funciona com o horário de verão. É necessário usar a data real
Yablargo
1
Obrigado @Yablargo. A versão anterior não funcionava muito bem com o fuso horário local, então editei para usar o formato iso 8601 utc datetime.
boskop
12

Converta hh:mm:ssstring em segundos em uma linha. Também permitiu que h:m:so formato e mm:ss, m:setc.

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)
Paul Hide
fonte
4
Explique sua resposta
B001 ᛦ
Converta hh:mm:ssstring em segundos em uma linha. Também permitiu h:m:sformato e mm:ss, m:setc.
Paul Esconder
Boa resposta! Mas você pode pular reverse(): '00: 01: 11'.split (':'). Reduzir ((val, entrada, i) => val + entrada * (3600 / Math.pow (60, i)), 0 ) === 71
CMR de
@CMR, abordagem interessante, mas caso mm:ssnão funcione corretamente.
Paul Hide
Math.pow é muito lento e pode ser evitado como mostrado em outras respostas baseadas em reduzir
Alejadro Xalabarder
8

experimentar

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;
Luca
fonte
5
ah, que * 1 é uma maneira inteligente de fazer com que ele não faça concatenação de strings :)
Dagg Nabbit
5

O método estático do Javascript resolve Date.UTC()o problema:

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;
}
Cronozoa
fonte
4

Aqui está uma forma um pouco mais legível na resposta original aprovada.

const getSeconds = (hms: string) : number => {
  const [hours, minutes, seconds] = hms.split(':');
  return (+hours) * 60 * 60 + (+minutes) * 60 + (+seconds);
};
Jan Vorcak
fonte
2
new Date(moment('23:04:33', "HH:mm")).getTime()

Saída: 1499755980000 (em milissegundos) (1499755980000/1000) (em segundos)

Observação: esta saída calcula o diff de 01/01/1970 12: 0: 0 até agora e precisamos implementar o moment.js

ITsDEv
fonte
OP pediu segundos, não milissegundos
user7294900
Olá, user7294900, Obrigado pelo seu comentário atualizarei minha resposta, apenas precisamos dividir por 1000
ITsDEv
1

Esta função também funciona para 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])
        }
      }

Philip Tran
fonte
1

Retirado da solução dada por Paul https://stackoverflow.com/a/45292588/1191101, mas usando a notação de função antiga para que também possa ser usada em outros motores js (por exemplo, java Rhino)

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

ou apenas este mais legível

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);
}
Alejadro Xalabarder
fonte
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>

Phillip Senn
fonte
0

Você pode fazer isso dinamicamente - caso encontre não apenas: HH: mm: ss, mas também mm: ss, ou mesmo ss sozinho.

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