Konwertuj ciąg HH: MM: SS na sekundy tylko w javascript

99

Mam podobne wymaganie: Konwertuj czas w formacie HH: MM: SS na tylko sekundy?

ale w javascript. Widziałem wiele przykładów konwersji sekund na różne formaty, ale nie HH: MM: SS na sekundy. Każda pomoc będzie mile widziana.

Sri Reddy
źródło
ups .. przepraszam za literówkę. tak, już czas hh: mm: ss
Sri Reddy
Co jest DDw HH:MM:DDśrodku?
Brian Driscoll,
2
To ten sam algorytm, co w pytaniu PHP.
scottheckel
Cóż ... H (godzina) == 3600 sekund, M (minuta) == 60 sekund ... więc ..
MilkyWayJoe
1
Jedynym rozwiązaniem, o którym myślę, jest podzielenie ciągu na tablicę, a następnie pomnożenie 3600 do godziny i pomnożenie 60 do min i dodanie wszystkiego z częścią sekundową. Czy to jest najprostsze rozwiązanie?
Sri Reddy,

Odpowiedzi:

194

Spróbuj tego:

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
źródło
3
Oto prototypowa wersja tego! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } UWAGA: || 0koniec jest dobry dla każdej implementacji tego kodu - zapobiega problemom z (wciąż poprawną) reprezentacją czasu HH: MM (wejścia typu Chrome = "czas" będą wyprowadzane w tym formacie, gdy sekundy = 0).
Fateh Khalsa
Niesamowite rzeczy koleś
eddy
mam tylko hh:mmnie secondsw tym przypadku to co muszę zmodyfikować ..?
Pan na całym świecie
1
@AbdulWaheed Zmień tę linię: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); navar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova
4
Użycie operatora „+” do konwersji ciągu liczbowego na liczbę nie jest dobrym pomysłem. Jest krótki i wygląda na „sprytny”, ale jest zagmatwany i nieczytelny kod. Zamiast tego użyj parseInt (x, 10). I unikaj jednej linijki. Zapobiegaj także błędom wynikającym z niezdefiniowanych danych wejściowych. Na przykład: to nie jest ciąg znaków, nie ma „:” lub tylko „HH: MM”. itd.
Dominik
68

Ta funkcja obsługuje „HH: MM: SS” oraz „MM: SS” lub „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
źródło
Świetnie, zatrzymam to, jeśli pojawi się wymóg upływu czasu w jakimkolwiek formacie. Dzięki!
Sri Reddy,
Jak dotąd najlepsza odpowiedź dla mnie
Rezwan Azfar Haleem
Ta odpowiedź jest przydatna
Mike Aron
Co muszę zmienić w Twojej funkcji, aby używać tylko w formacie „HH: MM”
noyruto88
39

Można to zrobić dość elastycznie, wykonując następujące czynności:

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

Dzieje się tak, ponieważ każda jednostka czasu w godzinach, minutach i sekundach jest wielokrotnością 60 większą niż mniejsza jednostka. Czas jest dzielony na składowe godzinowe, minutowe i sekundowe, a następnie redukowany do sekund, wykorzystując skumulowaną wartość wyższych jednostek pomnożoną przez 60 podczas przechodzenia przez każdą jednostkę.

+timeSłuży do oddania czasu do liczby.

Zasadniczo kończy się to: (60 * ((60 * HHHH) + MM)) + SS

Jeśli minęły tylko sekundy, wynikiem byłby łańcuch, więc aby naprawić, że możemy rzutować cały wynik na int:

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));
Paweł
źródło
to właściwie cholernie sprytne ... pytanie, jak szybko to jest w porównaniu z obliczeniami
ThatBrianDude
4
Tak, to sprytne, ale dobry przykład tworzenia trudnego do utrzymania kodu bez praktycznych korzyści. Zapisuje 4 znaki po zminimalizowaniu w porównaniu z minifikowaną wersją zaakceptowanej odpowiedzi. Biorąc pod uwagę, że rozmiar wielu stron internetowych przekracza obecnie 1 MB, oszczędność ta jest nieco mniejsza niż nieznaczna.
RobG
5
Chociaż ta odpowiedź nie jest tak zrozumiała, z wdziękiem radzi sobie zarówno z, HH:MM:SSjak MM:SS, podczas gdy zaakceptowana odpowiedź nie.
ckeeney
1
Ten ma błąd konwersji typu, jeśli podano tylko część sekund. Musisz jawnie zainicjować notatkę z 0, aby temu zapobiec. Działa: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);kończy się niepowodzeniem, ponieważ zwraca nieoczekiwany ciąg:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz
@FelixGertz Dobrze zauważone, edytuję w poprawce dla tego przypadku.
Paul
13

Ponieważ getTime funkcją obiektu Date pobiera milisekundy od 1970/01/01, możemy to zrobić:

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;
boskop
źródło
1
Właśnie sobie uświadomiłem, że to nie działa w przypadku czasu letniego. Musisz użyć aktualnej daty
Yablargo
1
@Yablargo Thanks. Poprzednia wersja nie działała zbyt dobrze z lokalną strefą czasową, więc zmodyfikowałem ją, aby używać formatu datetime iso 8601 utc.
boskop,
13

Konwertuj hh:mm:ssciąg na sekundy w jednej linii. Wolno także h:m:sformat i mm:ss, m:setc

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)
Paul Hide
źródło
4
Proszę wyjaśnić swoją odpowiedź
B001 ᛦ
Konwertuj hh:mm:ssciąg na sekundy w jednej linii. Wolno także h:m:sformat i mm:ss, m:sitd.
Paul Ukryj
Niezła odpowiedź! Ale możesz pominąć reverse(): '00: 01: 11'.split (':'). Redukuj ((val, pozycja, i) => val + pozycja * (3600 / Math.pow (60, i)), 0 ) === 71
CMR
@CMR, ciekawe podejście, ale w takim przypadku mm:ssnie będzie działać poprawnie.
Paul Hide
Math.pow jest bardzo powolny i można go uniknąć, jak pokazano w innych odpowiedziach opartych na redukcji
Alejadro Xalabarder
9

próbować

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;
Luca
źródło
5
ach, że * 1 to sprytny sposób na
uniknięcie
5

Metoda statyczna Javascript załatwia Date.UTC()sprawę:

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;
}
Chronozoa
źródło
4

Oto być może nieco bardziej czytelny formularz oryginalnej zatwierdzonej odpowiedzi.

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

Wyjście: 1499755980000 (w milisekundach) (1499755980000/1000) (w sekundach)

Uwaga: to wyjście oblicza diff od 1970-01-01 12: 0: 0 do teraz i musimy zaimplementować moment.js

ITsDEv
źródło
OP poprosił o sekundy, a nie milisekundy
użytkownik7294900
Cześć user7294900, dziękuję za komentarz zaktualizuję moją odpowiedź, jst musimy podzielić przez 1000
ITsDEv
1

Ta funkcja działa również dla 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
źródło
1

Zaczerpnięte z rozwiązania podanego przez Paula https://stackoverflow.com/a/45292588/1191101, ale przy użyciu starej notacji funkcji, dzięki czemu może być również używany w innych silnikach js (np. Java Rhino)

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

lub po prostu ten bardziej czytelny

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
źródło
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
źródło
0

Możesz to zrobić dynamicznie - jeśli napotkasz nie tylko: HH: mm: ss, ale także mm: ss, a nawet sam 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);
Jeffz
źródło
0

To najbardziej przejrzyste i łatwe do zrozumienia rozwiązanie:

function convertDurationtoSeconds(duration){
    const [hours, minutes, seconds] = duration.split(':');
    return Number(hours) * 60 * 60 + Number(minutes) * 60 + Number(seconds);
};

const input = '01:30:45';
const output = convertDurationtoSeconds(input);
console.log(`${input} is ${output} in seconds`);

Melchia
źródło