Converti HH: MM: stringa SS in secondi solo in javascript


97

Ho un requisito simile a questo: convertire il tempo in HH: MM: formato SS solo in secondi?

ma in javascript. Ho visto molti esempi di conversione dei secondi in diversi formati ma non HH: MM: SS in secondi. Qualsiasi aiuto sarebbe apprezzato.


oops .. scusa per l'errore di battitura. sì, è ora hh: mm: ss
Sri Reddy

Cosa c'è DDdentro HH:MM:DD?
Brian Driscoll

2
È lo stesso algoritmo di quella domanda PHP.
scottheckel

Bene .. H (ora) == 3600 secondi, M (minuto) == 60 secondi ... quindi ..
MilkyWayJoe

1
L'unica soluzione a cui penso è dividere la stringa in array e quindi moltiplicare 3600 per ora e moltiplicare 60 per min e aggiungere tutto con la parte dei secondi. Questa è la soluzione più semplice?
Sri Reddy

Risposte:


192

Prova questo:

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
Ecco una versione prototipo di questo! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } NOTA: || 0alla fine è utile per qualsiasi implementazione di questo codice - previene problemi con una rappresentazione temporale (ancora valida) di HH: MM (gli input di tipo Chrome = "ora" verranno visualizzati in questo formato quando secondi = 0).
Fateh Khalsa

Roba fantastica amico
edward

ho solo hh:mmnon secondsin questo caso cosa devo modificare ..?
Mr world wide

1
@AbdulWaheed Cambia questa linea: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); invar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova

4
L'uso dell'operatore "+" per convertire una stringa numerica in numero non è una buona idea. È breve e sembra "intelligente", ma è un codice confuso e non pulito. Utilizza invece parseInt (x, 10). Ed evita una riga. Prevenire anche errori da input indefiniti. Ad esempio: non è una stringa, non ha ":" o solo "HH: MM". ecc.
Dominik

67

Questa funzione gestisce "HH: MM: SS" così come "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;
}

Bene, lo terrò se il requisito per il tempo trascorso è di qualsiasi formato. Grazie!
Sri Reddy

La migliore risposta per me finora
Rezwan Azfar Haleem

Questa risposta è utile
Mike Aron

Cosa
devo

35

Questo può essere fatto abbastanza resilientemente con quanto segue:

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

Questo perché ogni unità di tempo all'interno di ore, minuti e secondi è un multiplo di 60 maggiore dell'unità più piccola. Il tempo viene suddiviso in componenti di ore, minuti e secondi, quindi ridotto a secondi utilizzando il valore accumulato delle unità superiori moltiplicato per 60 mentre passa attraverso ciascuna unità.

Il +timeviene utilizzato per lanciare il tempo di un numero.

Fondamentalmente finisce per fare: (60 * ((60 * HHHH) + MM)) + SS

Se vengono passati solo secondi, il risultato sarebbe una stringa, quindi per risolvere il problema potremmo eseguire il cast dell'intero risultato a un int:

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

questo è davvero dannatamente intelligente .. la domanda è quanto sia veloce rispetto a un calcolo
ThatBrianDude,

4
Sì, è intelligente, ma un buon esempio di creazione di codice difficile da mantenere senza alcun vantaggio pratico. Salva 4 caratteri quando minimizzato rispetto a una versione ridotta della risposta accettata. Dato che molte pagine web ora superano 1 MB, il risparmio è un po 'meno che insignificante.
RobG

4
Sebbene questa risposta non sia così comprensibile, gestisce con garbo entrambe HH:MM:SSle cose MM:SS, mentre la risposta accettata no.
ckeeney

1
Questo ha un bug di conversione del tipo, se viene fornita solo la parte dei secondi. È necessario inizializzare esplicitamente il memo con 0 per impedirlo. Funziona: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);non riesce perché restituisce una stringa inaspettata:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz

@FelixGertz Ben individuato, modificherò in una correzione per quel caso.
Paul

12

Poiché la funzione getTime dell'oggetto Date ottiene i millisecondi dal 01/01/1970, possiamo farlo:

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

1
Appena realizzato, questo non funziona con l'ora legale. È necessario utilizzare la data effettiva
Yablargo

1
@ Yablargo Thanks. La versione precedente non funzionava molto bene con il fuso orario locale, quindi l'ho modificata per utilizzare il formato datetime iso 8601 utc.
boskop

12

Converti la hh:mm:ssstringa in secondi in una riga. È consentito anche il h:m:sformato e mm:ss, m:secc

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

4
Spiega la tua risposta
B001 ᛦ

Converti la hh:mm:ssstringa in secondi in una riga. È consentito anche il h:m:sformato e mm:ss, m:secc.
Paul Hide

Bella risposta! Ma potresti saltare reverse(): '00: 01: 11'.split (':'). Reduce ((val, entry, i) => val + entry * (3600 / Math.pow (60, i)), 0 ) === 71
CMR

@ CMR, approccio interessante, ma in caso mm:sscontrario non funzionerà correttamente.
Paul Hide

Math.pow è molto lento e può essere evitato come mostrato in altre risposte basate su reduce
Alejadro Xalabarder

8

provare

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

5
ah, quello * 1 è un modo intelligente per non fare concatenazioni di stringhe :)
Dagg Nabbit

5

Il metodo statico di Javascript Date.UTC()fa il trucco:

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

Ecco forse una forma un po 'più leggibile sulla risposta originale approvata.

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

Uscita: 1499755980000 (in millisecondi) (1499755980000/1000) (in secondi)

Nota: questo output calcola la differenza da 1970-01-01 12: 0: 0 ad ora e dobbiamo implementare moment.js


OP ha chiesto secondi non millisecondi
user7294900

Ciao utente7294900, Grazie per il tuo commento aggiornerò la mia risposta, ma dobbiamo dividere per 1000
ITsDEv

1

Questa funzione funziona anche per 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

Tratto dalla soluzione data da Paul https://stackoverflow.com/a/45292588/1191101 ma utilizzando la vecchia notazione di funzione quindi può essere utilizzato anche in altri motori js (es. Java Rhino)

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

o solo questo più leggibile

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

Puoi farlo dinamicamente - nel caso in cui incontri non solo: HH: mm: ss, ma anche, mm: ss, o anche solo 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.