Konvertieren Sie HH: MM: SS-Zeichenfolgen nur in Javascript in Sekunden

96

Ich habe ähnliche Anforderungen wie diese: Zeit im HH: MM: SS-Format nur in Sekunden konvertieren?

aber in Javascript. Ich habe viele Beispiele für die Konvertierung von Sekunden in verschiedene Formate gesehen, aber nicht HH: MM: SS in Sekunden. Jede Hilfe wäre dankbar.

Sri Reddy
quelle
oops .. Entschuldigung für den Tippfehler. Ja, es ist Zeit, hh: mm: ss
Sri Reddy
Was ist das DDin HH:MM:DD?
Brian Driscoll
2
Es ist der gleiche Algorithmus wie in dieser PHP-Frage.
Scottheckel
Nun .. H (Stunde) == 3600 Sekunden, M (Minute) == 60 Sekunden ... also ..
MilkyWayJoe
1
Die einzige Lösung, an die ich denke, besteht darin, die Zeichenfolge in ein Array aufzuteilen und dann 3600 mit Stunde und 60 mit min zu multiplizieren und alles mit Sekunden zu addieren. Ist das die einfachste Lösung?
Sri Reddy

Antworten:

191

Versuche dies:

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
quelle
3
Hier ist eine Prototypversion davon! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } HINWEIS: Das || 0am Ende ist gut für jede Implementierung dieses Codes - es verhindert Probleme mit einer (noch gültigen) Zeitdarstellung von HH: MM (Chrome-Typ = "Zeit" -Eingaben werden in diesem Format ausgegeben, wenn Sekunden = 0).
Fateh Khalsa
Awesome stuff dude
edward
ich habe nur hh:mmnicht secondsin diesem Fall , was ich ändern muss ..?
Herr weltweit
1
@AbdulWaheed Ändere diese Zeile: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); invar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova
4
Die Verwendung des Operators "+" zum Konvertieren von numerischen Zeichenfolgen in Zahlen ist keine gute Idee. Es ist kurz und sieht "clever" aus, aber es ist verwirrend und kein sauberer Code. Verwenden Sie stattdessen parseInt (x, 10). Und vermeiden Sie Einzeiler. Verhindern Sie auch Fehler durch undefinierte Eingabe. Zum Beispiel: Es ist kein String, hat kein ":" oder nur "HH: MM". usw.
Dominik
66

Diese Funktion behandelt "HH: MM: SS" sowie "MM: SS" oder "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
quelle
Schön, ich werde es behalten, wenn die Anforderung für die verstrichene Zeit ein beliebiges Format hat. Vielen Dank!
Sri Reddy
Beste Antwort für mich bisher
Rezwan Azfar Haleem
Diese Antwort ist nützlich
Mike Aron
Was muss ich in Ihrer Funktion ändern, um sie nur im 'HH:
MM'
35

Dies kann ziemlich belastbar mit folgendem erfolgen:

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

Dies liegt daran, dass jede Zeiteinheit innerhalb der Stunden, Minuten und Sekunden ein Vielfaches von 60 größer ist als die kleinere Einheit. Die Zeit wird in Stunden, Minuten und Sekunden aufgeteilt und dann auf Sekunden reduziert, indem der akkumulierte Wert der höheren Einheiten multipliziert mit 60 multipliziert wird, wenn er durch jede Einheit geht.

Das +time wird die Zeit auf eine Zahl umgestellt.

Es endet im Grunde: (60 * ((60 * HHHH) + MM)) + SS

Wenn nur Sekunden vergangen sind, wäre das Ergebnis eine Zeichenfolge. Um dies zu beheben, können wir das gesamte Ergebnis in ein int umwandeln:

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));
Paul
quelle
das ist eigentlich verdammt schlau .. Frage ist, wie schnell dies im Vergleich zu einer Berechnung ist
ThatBrianDude
4
Ja, es ist klug, aber ein gutes Beispiel für die Erstellung von schwer zu pflegendem Code ohne praktischen Gewinn. Beim Minimieren werden 4 Zeichen gegenüber einer minimierten Version der akzeptierten Antwort gespeichert. Angesichts der Tatsache, dass viele Webseiten jetzt mehr als 1 MB groß sind, ist diese Einsparung etwas weniger als unbedeutend.
RobG
4
Obwohl diese Antwort nicht so verständlich ist, geht sie sowohl HH:MM:SSgut als auch gut mit MM:SSder akzeptierten Antwort um.
Ckeeney
1
Dieser hat einen Typkonvertierungsfehler, wenn dort nur der Sekundenanteil angegeben ist. Sie müssen das Memo explizit mit 0 initialisieren, um dies zu verhindern. Works: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);schlägt fehl, weil eine unerwartete Zeichenfolge zurückgegeben wird:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz
@FelixGertz Gut gesehen, ich werde einen Fix für diesen Fall bearbeiten.
Paul
12

Da die getTime- Funktion des Date-Objekts die Millisekunden seit dem 01.01.1970 erhält, können wir Folgendes tun:

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;
boskop
quelle
1
Gerade realisiert, funktioniert dies nicht mit Sommerzeit.
Müssen
1
@ Yablargo Danke. Die vorherige Version funktionierte nicht sehr gut mit der lokalen Zeitzone, daher habe ich sie so bearbeitet, dass sie das ISO 8601 utc datetime-Format verwendet.
Boskop
12

Konvertieren Sie die hh:mm:ssZeichenfolge in einer Zeile in Sekunden. Auch erlaubt h:m:sFormat und mm:ss, m:setc

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)
Paul Hide
quelle
4
Bitte erläutern Sie Ihre Antwort
B001
Konvertieren Sie die hh:mm:ssZeichenfolge in einer Zeile in Sekunden. Auch erlaubt h:m:sFormat und mm:ss, m:setc.
Paul Hide
Gute Antwort! Sie können jedoch reverse()Folgendes überspringen : '00: 01: 11'.split (':'). Reduzieren ((val, entry, i) => val + entry * (3600 / Math.pow (60, i)), 0 ) === 71
CMR
@ CMR, interessanter Ansatz, aber im Falle, dass mm:sses nicht richtig funktioniert.
Paul Hide
Math.pow ist sehr langsam und kann vermieden werden, wie in anderen Antworten basierend auf
Reduce gezeigt
8

Versuchen

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;
Luca
quelle
5
ah, das * 1 ist ein kluger Weg, um es zu bekommen, keine String-Verkettung zu machen :)
Dagg Nabbit
5

Die statische Methode von Javascript Date.UTC()macht den Trick:

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;
}
Chronozoen
quelle
4

Hier ist vielleicht ein etwas besser lesbares Formular für die ursprünglich genehmigte Antwort.

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

Ausgabe: 1499755980000 (in Millisekunden) (1499755980000/1000) (in Sekunden)

Hinweis: Diese Ausgabe berechnet den Unterschied von 1970-01-01 12: 0: 0 bis jetzt und wir müssen die moment.js implementieren

ITsDEv
quelle
OP fragte nach Sekunden nicht Millisekunden
user7294900
Hallo Benutzer7294900, Danke für Ihren Kommentar, ich werde meine Antwort aktualisieren, jst wir müssen durch 1000 teilen
ITsDEv
1

Diese Funktion funktioniert auch für 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
quelle
1

Entnommen aus der von Paul angegebenen Lösung https://stackoverflow.com/a/45292588/1191101, jedoch unter Verwendung der alten Funktionsnotation, sodass sie auch in anderen js-Engines (z. B. Java Rhino) verwendet werden kann.

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

oder nur dieses mehr lesbar

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
quelle
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
quelle
0

Sie können dies dynamisch tun - falls Sie nicht nur auf Folgendes stoßen: HH: mm: ss, sondern auch auf mm: ss oder sogar ss allein.

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
quelle