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.

Sri Reddy
fuente
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);
Dagg Nabbit
fuente
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;
}
Niko
fuente
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));
Pablo
fuente
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;
boskop
fuente
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)
Paul Hide
fuente
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;
Luca
fuente
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;
}
Cronozoos
fuente
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);
};
Jan Vorcak
fuente
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

ITsDEv
fuente
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])
        }
      }

Philip Tran
fuente
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);
}
Alejadro Xalabarder
fuente
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
fuente
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);
Jeffz
fuente