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.


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

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;
}

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

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;

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)

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;

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;
}

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);
};

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


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


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);
}

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

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.