Convierta HH: MM: SS cadena a segundos solo en javascript


97

Tengo un requisito similar a este: ¿ Convertir la hora en formato HH: MM: SS a solo segundos?

pero en javascript. He visto muchos ejemplos de conversión de segundos en diferentes formatos, pero no HH: MM: SS en segundos. Cualquier ayuda sería apreciada.


Ups .. perdón por el error tipográfico. sí, es hora hh: mm: ss
— Sri Reddy

¿Qué es el DDen HH:MM:DD?
— Brian Driscoll

2
Es el mismo algoritmo que está en esa pregunta de PHP.
— scottheckel

Bueno ... H (hora) == 3600 segundos, M (minuto) == 60 segundos ... entonces ...
— MilkyWayJoe

1
La única solución en la que pienso es dividir la cadena en una matriz y luego multiplicar 3600 por hora y multiplicar 60 por minuto y agregar todo con la parte de segundos. ¿Es esta la solución más sencilla?
— Sri Reddy

Respuestas:


192

Prueba esto:

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
¡Aquí hay una versión prototipo de esto! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } NOTA: el || 0al final es bueno para cualquier implementación de este código; evita problemas con una representación de tiempo (aún válida) de HH: MM (las entradas de tipo Chrome = "tiempo" se mostrarán en este formato cuando segundos = 0).
— Fateh Khalsa

Cosas increíbles, amigo
— Edward

solo que hh:mmno tengo secondsen este caso lo que tengo que modificar ..?
— Mr world wide

1
@AbdulWaheed Cambia esta línea: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); avar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
— Rova

4
El uso del operador "+" para convertir una cadena numérica en un número no es una buena idea. Es breve y parece "inteligente", pero es un código confuso y no limpio. Utilice parseInt (x, 10) en su lugar. Y evita una sola línea. También evite errores por entrada indefinida. Por ejemplo: no es una cadena, no tiene ":" o solo "HH: MM". etc.
— Dominik

67

Esta función maneja "HH: MM: SS" así como "MM: SS" o "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;
}

Bien, lo guardaré si surge algún requisito para el tiempo transcurrido es cualquier formato. ¡Gracias!
— Sri Reddy

La mejor respuesta para mí hasta ahora
— Rezwan Azfar Haleem

Esta respuesta es útil
— Mike Aron

¿Qué necesito cambiar en su función para usar solo en formato 'HH: MM'
— noyruto88

35

Esto se puede hacer de manera bastante flexible con lo siguiente:

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

Esto se debe a que cada unidad de tiempo dentro de las horas, minutos y segundos es un múltiplo de 60 mayor que la unidad más pequeña. El tiempo se divide en componentes de horas, minutos y segundos, luego se reduce a segundos utilizando el valor acumulado de las unidades más altas multiplicado por 60 a medida que pasa por cada unidad.

los +time utiliza para convertir la hora en un número.

Básicamente termina haciendo: (60 * ((60 * HHHH) + MM)) + SS

Si solo se pasan segundos, el resultado sería una cadena, por lo que, para solucionarlo, podríamos convertir todo el resultado en un int:

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

eso es realmente bastante inteligente ... la pregunta es qué tan rápido se compara esto con un cálculo
— ThatBrianDude

4
Sí, es inteligente, pero es un buen ejemplo de cómo crear código difícil de mantener sin ningún beneficio práctico. Guarda 4 caracteres cuando se minifica frente a una versión minificada de la respuesta aceptada. Dado que muchas páginas web tienen ahora más de 1 MB, ese ahorro es algo menos que insignificante.
— RobG

4
Aunque esta respuesta no es tan comprensible, no manejar con gracia tanto HH:MM:SS, así como MM:SS, mientras que la respuesta aceptada no lo hace.
— ckeeney

1
Este tiene un error de conversión de tipo, si solo se da la porción de segundos. Debe iniciar explícitamente la nota con 0 para evitarlo. Trabajos: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);falla porque devuelve una cadena inesperada:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
— Felix Gertz

@FelixGertz Bien visto, editaré una solución para ese caso.
— Paul

12

Dado que la función getTime del objeto Date obtiene los milisegundos desde el 01/01/1970, podemos hacer esto:

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

1
Me acabo de dar cuenta, esto no funciona con el horario de verano. Necesito usar la fecha real
— Yablargo

1
@Yablargo Gracias. La versión anterior no funcionaba muy bien con la zona horaria local, así que la edité para usar el formato de fecha y hora utc iso 8601.
— Boskop

12

Convierta la hh:mm:sscadena en segundos en una línea. También se permite h:m:sformato y mm:ss, m:setc.

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

4
Explique su respuesta
— B001 ᛦ

Convierta la hh:mm:sscadena en segundos en una línea. También se permite el h:m:sformato y mm:ss, m:setc.
— Paul Hide

¡Buena respuesta! Pero puede omitir reverse(): '00: 01: 11'.split (':'). Reduce ((val, entry, i) => val + entry * (3600 / Math.pow (60, i)), 0 ) === 71
— CMR

@CMR, enfoque interesante, pero en caso de mm:ssque no funcione correctamente.
— Paul Hide

Math.pow es muy lento y se puede evitar como se muestra en otras respuestas basadas en reduce
— Alejadro Xalabarder

8

tratar

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

5
ah, ese * 1 es una forma inteligente de hacer que no haga concatenación de cadenas :)
— Dagg Nabbit

5

El método estático de Javascript Date.UTC()hace el truco:

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

Aquí hay tal vez un formulario un poco más legible en la respuesta aprobada original.

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

Salida: 1499755980000 (en milisegundos) (1499755980000/1000) (en segundos)

Nota: esta salida calcula la diferencia desde 1970-01-01 12: 0: 0 hasta ahora y necesitamos implementar el moment.js


OP pidió segundos, no milisegundos
— user7294900

Hola usuario7294900, Gracias por tu comentario, actualizaré mi respuesta, solo necesitamos dividir por 1000
— ITsDEv

1

Esta función también 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])
        }
      }


1

Tomado de la solución dada por Paul https://stackoverflow.com/a/45292588/1191101 pero usando la notación de función anterior para que también se pueda usar en otros motores js (por ejemplo, java Rhino)

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

o solo este más legible

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

Puede hacer esto de forma dinámica, en caso de que no solo encuentre: HH: mm: ss, sino también mm: ss, o incluso ss solo.

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.