JavaScript sekund do czasu ciąg znaków w formacie gg: mm: ss


300

Chcę przekonwertować czas trwania, tj. Liczbę sekund na ciąg czasu oddzielony dwukropkami (gg: mm: ss)

Znalazłem tu przydatne odpowiedzi, ale wszystkie mówią o konwersji do formatu x godzin i x minut.

Czy jest więc mały fragment, który robi to w jQuery lub po prostu surowy JavaScript?


11
Testy porównawcze kilku sugerowanych odpowiedzi w tym wątku. jsperf.com/ms-to-hh-mm-ss-time-format
Claudijo

Odpowiedzi:


583
String.prototype.toHHMMSS = function () {
    var sec_num = parseInt(this, 10); // don't forget the second param
    var hours   = Math.floor(sec_num / 3600);
    var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
    var seconds = sec_num - (hours * 3600) - (minutes * 60);

    if (hours   < 10) {hours   = "0"+hours;}
    if (minutes < 10) {minutes = "0"+minutes;}
    if (seconds < 10) {seconds = "0"+seconds;}
    return hours+':'+minutes+':'+seconds;
}

Możesz go teraz używać w następujący sposób:

alert("5678".toHHMMSS());

Fragment roboczy:


1
Dzięki za pomysł na prototyp, podoba mi się, jak łatwiej to nazwać. Prototypowałem numer, więc mogę go też nazywać. Znalazłem również tę odpowiedź, która usunęłaby godziny i minuty, gdyby nie były potrzebne.
alunsford3

21
użyj operatora „%” >> var minutes = Math.floor ((sec_num% 3600) / 60); var seconds = Math.floor (sec_num% 60);
IvanM

3
ah dzięki. Nie widzę, aby działał w obie strony jako ciąg znaków, dopóki nie wywołasz funkcji .toString () na liczbie całkowitej. możesz sprawić, by działało to na odwrót, analizując również int
Sonic Soul

51
Nie wkładaj prototypu, po prostu zrób funkcję narzędziową.
Michael J. Calkins,

15
zmodyfikować prototyp takiej rzeczy? 390 głosów pozytywnych? poważnie?
Lukas Liesis

197

Możesz to zrobić bez zewnętrznej biblioteki JS za pomocą metody JS Date, takiej jak:

var date = new Date(0);
date.setSeconds(45); // specify value for SECONDS here
var timeString = date.toISOString().substr(11, 8);
console.log(timeString)


4
Dlaczego ta odpowiedź jest tak niska? Rozumiem, że w 2011 prawdopodobnie IE 7 i 8 były bazą, która nie będzie go obsługiwać, ale to koniec 2014 roku, więc to proste, bezproblemowe rozwiązanie powinno być znacznie wyższe.
Emil Borconi,

2
Z MDN: Jeśli określony parametr jest poza oczekiwanym zakresem, setSeconds () próbuje odpowiednio zaktualizować informacje o dacie w obiekcie Date. Na przykład, jeśli użyjesz 100 dla secondsValue, minuty zapisane w obiekcie Date zostaną zwiększone o 1, a 40 zostanie użyte dla sekund. Więc tak, wygląda dobrze!
Andrew,

40
Podoba mi się ta odpowiedź. To może być nawet krótszy: new Date(1000 * seconds).toISOString().substr(11, 8).
Bohumir Zamecnik

4
Niezła odpowiedź. Możesz użyć .replace(/^[0:]+/, "")po, substraby usunąć wszystkie zera i :od początku ciągu.
Palo,

1
Dodaj to z przodu, aby obsłużyć czas ponad 24 godziny. parseInt (d / 86400) + „d”
Tofandel

82

Aby uzyskać część czasu w formacie hh:MM:ss, możesz użyć tego wyrażenia regularnego:

(Zostało to wspomniane przez kogoś w tym samym poście, dzięki za to.)

    var myDate = new Date().toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
    console.log(myDate)


8
+1 - bardzo proste; dzięki! Użyłem tylko tego wariantu, aby pokazać minuty i sekundy:var myDate = new Date().toTimeString().replace(/.*(\d{2}:\d{2})(:\d{2}).*/, "$1");
Topher Fangio

1
nie powinno to być „nowa data (null, null, null, null, null, timeInSecs) .toTimeString (). replace (/.* (\ d {2}:) (\ d {2}: \ d {2 }). * /, „2 $”)?
obie

6
Używanie replacejest mylące. Dlaczego nie użyć new Date(null, null, null, null, null, timeInSeconds).toTimeString().match(/\d{2}:\d{2}:\d{2}/)[0]?
Călin Darie

4
Jest to odpowiednie do pokazywania określonego czasu, ale zwróć uwagę, że pytanie (i inne odpowiedzi tutaj) dotyczą pokazywania czasu trwania, tj. Określonej liczby sekund niezależnie od bieżącego czasu.
mahemoff

4
Prostsza wersja tego:new Date().toTimeString().split(" ")[0]
Henrik N

52

Polecam zwykły javascript, używając obiektu Date:

var seconds = 9999;
// multiply by 1000 because Date() requires miliseconds
var date = new Date(seconds * 1000);
var hh = date.getUTCHours();
var mm = date.getUTCMinutes();
var ss = date.getSeconds();
// If you were building a timestamp instead of a duration, you would uncomment the following line to get 12-hour (not 24) time
// if (hh > 12) {hh = hh % 12;}
// These lines ensure you have two-digits
if (hh < 10) {hh = "0"+hh;}
if (mm < 10) {mm = "0"+mm;}
if (ss < 10) {ss = "0"+ss;}
// This formats your string to HH:MM:SS
var t = hh+":"+mm+":"+ss;
document.write(t);

(Oczywiście, utworzony obiekt Date będzie powiązany z faktyczną datą, ale dane są obce, więc do tych celów nie musisz się o to martwić.)


Wydaje się, że data jest zapisywana w lokalnej strefie czasowej, co w moim przypadku dodaje godzinę do godziny. Przy sekundach = 0 dostaję „01:00:00” (czw 01.01 1970 01:00:00 GMT + 0100 (CET)), co jest złe.
mivk

3
Otrzymam poprawny wynik, jeśli użyję date.getUTCHours()i date.getUTCMinutes().
mivk

Nie rozumiem, dlaczego zwracasz 12-godzinny znacznik czasu, kiedy poprosił o czas trwania?
Nathan C. Tresch

@JellicleCat Zmieniono na +1 i ładne imię.
Nathan C. Tresch

1
Podoba mi się to, ale zakładam, że czas trwania jest krótszy niż 24
godziny

40

Wyszukiwarka Google wykazała ten wynik :

function secondsToTime(secs)
{
    secs = Math.round(secs);
    var hours = Math.floor(secs / (60 * 60));

    var divisor_for_minutes = secs % (60 * 60);
    var minutes = Math.floor(divisor_for_minutes / 60);

    var divisor_for_seconds = divisor_for_minutes % 60;
    var seconds = Math.ceil(divisor_for_seconds);

    var obj = {
        "h": hours,
        "m": minutes,
        "s": seconds
    };
    return obj;
}

8
secondsToTime(119.9)=> Object {h: 0, m: 1, s: 60}. Aby to naprawić, dodaj secs = Math.round(secs);na początku metody. Oczywiście widzieliśmy ten błąd podczas
pokazu

29

Wariacja na temat. Trochę inaczej radzi sobie z jednocyfrowymi sekundami

seconds2time(0)  ->  "0s" 
seconds2time(59) -> "59s" 
seconds2time(60) -> "1:00" 
seconds2time(1000) -> "16:40" 
seconds2time(4000) -> "1:06:40"

function seconds2time (seconds) {
    var hours   = Math.floor(seconds / 3600);
    var minutes = Math.floor((seconds - (hours * 3600)) / 60);
    var seconds = seconds - (hours * 3600) - (minutes * 60);
    var time = "";

    if (hours != 0) {
      time = hours+":";
    }
    if (minutes != 0 || time !== "") {
      minutes = (minutes < 10 && time !== "") ? "0"+minutes : String(minutes);
      time += minutes+":";
    }
    if (time === "") {
      time = seconds+"s";
    }
    else {
      time += (seconds < 10) ? "0"+seconds : String(seconds);
    }
    return time;
}

Dzięki, że oszczędziłeś mi godzinę na tym
starsinmypockets

29

Oto moje zdanie na ten temat:

function formatTime(seconds) {
  const h = Math.floor(seconds / 3600);
  const m = Math.floor((seconds % 3600) / 60);
  const s = Math.round(seconds % 60);
  return [
    h,
    m > 9 ? m : (h ? '0' + m : m || '0'),
    s > 9 ? s : '0' + s
  ].filter(Boolean).join(':');
}

Oczekiwane rezultaty:

const expect = require('expect');
expect(formatTime(0)).toEqual('0:00');
expect(formatTime(1)).toEqual('0:01');
expect(formatTime(599)).toEqual('9:59');
expect(formatTime(600)).toEqual('10:00');
expect(formatTime(3600)).toEqual('1:00:00');
expect(formatTime(360009)).toEqual('100:00:09');
expect(formatTime(0.2)).toEqual('0:00');

Możesz to zapisać jako: const formatTime = (seconds, h = Math.floor(seconds / 3600), m = Math.floor((seconds % 3600) / 60), s = seconds % 60) => [h, m > 9 ? m : '0' + m, s > 9 ? s : '0' + s].filter(s => s).join(':');
Ruben Stolk

2
@ RubenStolk Uważam, że nieco mylące jest posiadanie funkcji, która pobiera dwa secondargumenty. Uważam, że moja wersja jest wyraźniejsza, nawet jeśli jest trochę bardziej szczegółowa.
Tom Esterez

seconds: numberwpisać adnotacje w es6?
Olian04,

1
Przecinek końcowy @pstanton jest obsługiwany od IE9: caniuse.com/#feat=mdn-javascript_grammar_trailing_commas . Osobiście wybieram teraz ignorowanie tych starych przeglądarek. Ale masz rację, usunąłem go, więc odpowiedź jest bardziej ogólna.
Tom Esterez

1
Świetne rozwiązanie. Może po prostu zmień sekundy naconst s = Math.round(seconds % 60);
Raff

16

Podoba mi się pierwsza odpowiedź. Istnieje kilka optymalizacji:

  • dane źródłowe to liczba. dodatkowe obliczenia nie są potrzebne.

  • dużo nadmiaru przetwarzania

Kod wyniku:

Number.prototype.toHHMMSS = function () {
    var seconds = Math.floor(this),
        hours = Math.floor(seconds / 3600);
    seconds -= hours*3600;
    var minutes = Math.floor(seconds / 60);
    seconds -= minutes*60;

    if (hours   < 10) {hours   = "0"+hours;}
    if (minutes < 10) {minutes = "0"+minutes;}
    if (seconds < 10) {seconds = "0"+seconds;}
    return hours+':'+minutes+':'+seconds;
}

1
Myślę, że ta funkcja jest funkcją używaną z przodu i dlatego prototypuję ciąg, a nie liczbę. Liczba zawsze może być ciągiem znaków, ale nie odwrotnie.
powtac

3
Myślę, że Numberma rację, ponieważ secondsw rzeczywistości jest liczbą. powinieneś przekonwertować z łańcucha przed użyciem tej funkcji, co jest właściwe!
caesarsol,

2
pozytywna odpowiedź, podobnie jak ta, jest zła. Założę się, że nie potrzebujesz WSZYSTKICH liczb, aby mieć tę metodę. Nie modyfikuj prototypu dla losowych narzędzi.
Lukas Liesis

lub po prostu prototypować i uczynić z niego funkcję numToHHMMSS lub strTOHHMMSS
yeahdixon

To rozwiązanie działa, gdy wybrane rozwiązanie generuje sekundy 60 dla niektórych wartości.
AndroidDev,

14

Korzystanie z niesamowitej biblioteki mom.js :

function humanizeDuration(input, units ) { 
  // units is a string with possible values of y, M, w, d, h, m, s, ms
  var duration = moment().startOf('day').add(units, input),
    format = "";

  if(duration.hour() > 0){ format += "H [hours] "; }

  if(duration.minute() > 0){ format += "m [minutes] "; }

  format += " s [seconds]";

  return duration.format(format);
}

Pozwala to określić dowolny czas trwania, godziny, minuty, sekundy, młyny i zwraca wersję czytelną dla człowieka.


14
function formatTime(seconds) {
    return [
        parseInt(seconds / 60 / 60),
        parseInt(seconds / 60 % 60),
        parseInt(seconds % 60)
    ]
        .join(":")
        .replace(/\b(\d)\b/g, "0$1")
}

Dalsze wyjaśnienie, dlaczego ta odpowiedź byłaby przydatna dla pytającego lub co mogło być błędne w pierwotnym pytaniu, pomogłoby podnieść jakość tej odpowiedzi.
Josh Burgess,

1
Dość samo wyjaśniająca i dobra odpowiedź, zmniejszona i uproszczona najlepsza odpowiedź.
AlexioVay,

Dokładna odpowiedź
:)

11

new Date().toString().split(" ")[4];

wynik 15:08:03


Fajnie dzięki! A małym usprawnieniem, które wprowadziłem dla moich potrzeb, było przekonwertowanie czasu trwania w milisekundach na GG: MM: SS - new Date(new Date().getTime() - startTime).toUTCString().split(" ")[4]gdzie startTimewcześniej ustawiałem startTime = new Date().getTime();. (Musiałem skorzystać, toUTCString()ponieważ w przeciwnym razie godziny byłyby poza godzinami.)
Richard Wiseman,

10

To całkiem proste

function toTimeString(seconds) {
  return (new Date(seconds * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];
}

Działa to tylko wtedy, gdy Twój czas trwania jest krótszy niż 1 dzień. Ale poza tym całkiem nieźle.
cjbarth,

8
s2t=function (t){
  return parseInt(t/86400)+'d '+(new Date(t%86400*1000)).toUTCString().replace(/.*(\d{2}):(\d{2}):(\d{2}).*/, "$1h $2m $3s");
}

s2t(123456);

wynik:

1d 10h 17m 36s

6

Najbardziej podobała mi się Webjins, więc rozszerzyłem ją, by wyświetlała dni z sufiksem reklamy, uzależniłem wyświetlanie i umieściłem jako sufiks w zwykłych sekundach:

function sec2str(t){
    var d = Math.floor(t/86400),
        h = ('0'+Math.floor(t/3600) % 24).slice(-2),
        m = ('0'+Math.floor(t/60)%60).slice(-2),
        s = ('0' + t % 60).slice(-2);
    return (d>0?d+'d ':'')+(h>0?h+':':'')+(m>0?m+':':'')+(t>60?s:s+'s');
}

zwraca „3d 16:32:12” lub „16:32:12” lub „32:12” lub „12s”


Będzie to niepoprawne przez 24 dni lub dłużej
Charlie Martin

dlaczego porównujesz ciągi większe od 0?
Jimmy Kane

@JimmyKane, ponieważ automatyczne rzutowanie czcionek - uwielbiam to! (plus: kod jest łatwiejszy do odczytania (z jakiegoś powodu masz rzutowanie tekstu, ale przestańmy trollować (oboje z nas)). plus: funkcja nie powiedzie się tylko, jeśli t jest NaN - więc jeśli chcesz bezpieczeństwa: zrób to na wejściu!)
Czwartek

@ nïkö Ok Rozumiem, ale bardziej surowe nowe wersje JS, linters itp. mogą na to narzekać. Mówiąc tylko: dong, zrozum mnie źle. Podoba mi się twoja odpowiedź
Jimmy Kane

6

Uwielbiałem odpowiedź Powtaca, ale chciałem jej użyć w angular.js, więc stworzyłem filtr przy użyciu jego kodu.

.filter('HHMMSS', ['$filter', function ($filter) {
    return function (input, decimals) {
        var sec_num = parseInt(input, 10),
            decimal = parseFloat(input) - sec_num,
            hours   = Math.floor(sec_num / 3600),
            minutes = Math.floor((sec_num - (hours * 3600)) / 60),
            seconds = sec_num - (hours * 3600) - (minutes * 60);

        if (hours   < 10) {hours   = "0"+hours;}
        if (minutes < 10) {minutes = "0"+minutes;}
        if (seconds < 10) {seconds = "0"+seconds;}
        var time    = hours+':'+minutes+':'+seconds;
        if (decimals > 0) {
            time += '.' + $filter('number')(decimal, decimals).substr(2);
        }
        return time;
    };
}])

Jest funkcjonalnie identyczny, tyle że dodałem w opcjonalnym polu dziesiętnym, aby wyświetlić ułamki sekund. Używaj go jak każdego innego filtra:

{{ elapsedTime | HHMMSS }} wyświetla: 01:23:45

{{ elapsedTime | HHMMSS : 3 }} wyświetla: 01:23:45.678


Mam dwa obiekty datetime i chcę obliczyć różnicę tego obiektu 2 datetime i zwrócić dane wyjściowe jak w tym formacie: Hour: Minutes: Seconds with double digit like: 01: 02: 45. Czy możesz mi powiedzieć lub poprowadzić mnie trochę z twoim kodem?
Uczenie się overtinker-mylić

4

Myślę, że pod względem wydajności jest to zdecydowanie najszybszy:

var t = 34236; // your seconds
var time = ('0'+Math.floor(t/3600) % 24).slice(-2)+':'+('0'+Math.floor(t/60)%60).slice(-2)+':'+('0' + t % 60).slice(-2)
//would output: 09:30:36

Naprawdę niesamowite. Gratulacje!
Brynner Ferreira

Ładnie ... i> 24 godziny bezpiecznie.
Jeffz

4
function toHHMMSS(seconds) {
    var h, m, s, result='';
    // HOURs
    h = Math.floor(seconds/3600);
    seconds -= h*3600;
    if(h){
        result = h<10 ? '0'+h+':' : h+':';
    }
    // MINUTEs
    m = Math.floor(seconds/60);
    seconds -= m*60;
    result += m<10 ? '0'+m+':' : m+':';
    // SECONDs
    s=seconds%60;
    result += s<10 ? '0'+s : s;
    return result;
}

Przykłady

    toHHMMSS (111); 
    „01:51”

    toHHMMSS (4444);
    „01:14:04”

    toHHMMSS (33);
    „00:33”

Włożyłbym też Math.floor()sekundy, ponieważ mogą być podawane w postaci dziesiętnej. (Zdarzyło się ze mną.)
Zima

3

Oto kolejna wersja, która obsługuje również dni:

function FormatSecondsAsDurationString( seconds )
{
    var s = "";

    var days = Math.floor( ( seconds / 3600 ) / 24 );
    if ( days >= 1 )
    {
        s += days.toString() + " day" + ( ( days == 1 ) ? "" : "s" ) + " + ";
        seconds -= days * 24 * 3600;
    }

    var hours = Math.floor( seconds / 3600 );
    s += GetPaddedIntString( hours.toString(), 2 ) + ":";
    seconds -= hours * 3600;

    var minutes = Math.floor( seconds / 60 );
    s += GetPaddedIntString( minutes.toString(), 2 ) + ":";
    seconds -= minutes * 60;

    s += GetPaddedIntString( Math.floor( seconds ).toString(), 2 );

    return s;
}

function GetPaddedIntString( n, numDigits )
{
    var nPadded = n;
    for ( ; nPadded.length < numDigits ; )
    {
        nPadded = "0" + nPadded;
    }

    return nPadded;
}

3

Można użyć wyrażenia regularnego, aby dopasować podłańcuch czasu w ciągu znaków zwróconym z toString()metody obiektu Date, który jest sformatowany w następujący sposób: „czw. 05. 2012 02:45:12 GMT + 0100 (GMT czas letni)”. Zwróć uwagę, że to rozwiązanie wykorzystuje czas od epoki: północ 1 stycznia 1970 r. To rozwiązanie może być jedno-liniowe, chociaż podział na wiele ułatwia zrozumienie.

function secondsToTime(seconds) {
    const start = new Date(1970, 1, 1, 0, 0, 0, 0).getTime();
    const end = new Date(1970, 1, 1, 0, 0, parseInt(seconds), 0).getTime();
    const duration = end - start;

    return new Date(duration).toString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
}

2

Oto jak to zrobiłem. Wygląda na to, że działa dość dobrze i jest niezwykle kompaktowy. (Używa jednak wielu operatorów trójskładnikowych)

function formatTime(seconds) {
  var hh = Math.floor(seconds / 3600),
    mm = Math.floor(seconds / 60) % 60,
    ss = Math.floor(seconds) % 60;
  return (hh ? (hh < 10 ? "0" : "") + hh + ":" : "") + ((mm < 10) && hh ? "0" : "") + mm + ":" + (ss < 10 ? "0" : "") + ss
}

... i do formatowania ciągów ...

String.prototype.toHHMMSS = function() {
  formatTime(parseInt(this, 10))
};

2

Możesz użyć następującej funkcji do przeliczenia czasu (w sekundach) na HH:MM:SSformatowanie:

var convertTime = function (input, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    return [
        pad(Math.floor(input / 3600)),
        pad(Math.floor(input % 3600 / 60)),
        pad(Math.floor(input % 60)),
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

Bez przekazywania separatora służy :jako (domyślny) separator:

time = convertTime(13551.9941351); // --> OUTPUT = 03:45:51

Jeśli chcesz użyć -jako separatora, po prostu przekaż go jako drugi parametr:

time = convertTime(1126.5135155, '-'); // --> OUTPUT = 00-18-46

Próbny

var convertTime = function (input, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    return [
        pad(Math.floor(input / 3600)),
        pad(Math.floor(input % 3600 / 60)),
        pad(Math.floor(input % 60)),
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

document.body.innerHTML = '<pre>' + JSON.stringify({
    5.3515555 : convertTime(5.3515555),
    126.2344452 : convertTime(126.2344452, '-'),
    1156.1535548 : convertTime(1156.1535548, '.'),
    9178.1351559 : convertTime(9178.1351559, ':'),
    13555.3515135 : convertTime(13555.3515135, ',')
}, null, '\t') +  '</pre>';

Zobacz także to skrzypce .



1

Tak to zrobiłem

function timeFromSecs(seconds)
{
    return(
    Math.floor(seconds/86400)+'d :'+
    Math.floor(((seconds/86400)%1)*24)+'h : '+
    Math.floor(((seconds/3600)%1)*60)+'m : '+
    Math.round(((seconds/60)%1)*60)+'s');
}

timeFromSecs (22341938) zwróci „258d 14h 5m 38s”


1

Osobiście wolę jednostkę wiodącą (dni, godziny, minuty) bez wiodących zer. Ale sekundy zawsze powinny być poprzedzone minutami (0:13), tę prezentację można łatwo uznać za „czas trwania”, bez dalszych wyjaśnień (oznaczenie jako min, sek (s) itp.), Do użytku w różnych językach (internacjonalizacja).

    // returns  (-)d.h:mm:ss(.f)
    //          (-)h:mm:ss(.f)
    //          (-)m:ss(.f)
    function formatSeconds (value, fracDigits) {
        var isNegative = false;
        if (isNaN(value)) {
            return value;
        } else if (value < 0) {
            isNegative = true;
            value = Math.abs(value);
        }
        var days = Math.floor(value / 86400);
        value %= 86400;
        var hours = Math.floor(value / 3600);
        value %= 3600;
        var minutes = Math.floor(value / 60);
        var seconds = (value % 60).toFixed(fracDigits || 0);
        if (seconds < 10) {
            seconds = '0' + seconds;
        }

        var res = hours ? (hours + ':' + ('0' + minutes).slice(-2) + ':' + seconds) : (minutes + ':' + seconds);
        if (days) {
            res = days + '.' + res;
        }
        return (isNegative ? ('-' + res) : res);
    }

// imitujące formatowanie czasu trwania strony serwera (.net, C #), takie jak:

    public static string Format(this TimeSpan interval)
    {
        string pattern;
        if (interval.Days > 0)          pattern = @"d\.h\:mm\:ss";
        else if (interval.Hours > 0)    pattern = @"h\:mm\:ss";
        else                            pattern = @"m\:ss";
        return string.Format("{0}", interval.ToString(pattern));
    }

1

Możesz użyć Momement.js z wtyczką formatu momentu-czasu :

var seconds = 3820;
var duration = moment.duration(seconds, 'seconds');
var formatted = duration.format("hh:mm:ss");
console.log(formatted); // 01:03:40
<!-- Moment.js library -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

<!-- moment-duration-format plugin -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>

Zobacz także to skrzypce


Działa jak urok (z wyjątkiem formatu, który nie jest zdefiniowany) do konwersji czasu trwania w obiekcie na miesiące, dni, godziny, minuty i sekundy
Pi Home Server

1

const secondsToTime = (seconds, locale) => {
    const date = new Date(0);
    date.setHours(0, 0, seconds, 0);
    return date.toLocaleTimeString(locale);
}
console.log(secondsToTime(3610, "en"));

gdzie parametr locale („en”, „de” itp.) jest opcjonalny


1
secToHHMM(number: number) {
    debugger;
    let hours = Math.floor(number / 3600);
    let minutes = Math.floor((number - (hours * 3600)) / 60);
    let seconds = number - (hours * 3600) - (minutes * 60);
    let H, M, S;
    if (hours < 10) H = ("0" + hours);
    if (minutes < 10) M = ("0" + minutes);
    if (seconds < 10) S = ("0" + seconds);
    return (H || hours) + ':' + (M || minutes) + ':' + (S || seconds);
}

1

Oto jeden linijka zaktualizowana na rok 2019:

//your date
var someDate = new Date("Wed Jun 26 2019 09:38:02 GMT+0100") 

var result = `${String(someDate.getHours()).padStart(2,"0")}:${String(someDate.getMinutes()).padStart(2,"0")}:${String(someDate.getSeconds()).padStart(2,"0")}`

//result will be "09:38:02"

Myślę, że OP chce przekonwertować czas trwania (w sekundach), a nie Dateobiekt.
mrdaliri

Ups, my bad :(
DataGreed

1

Oto dość proste rozwiązanie, które zaokrągla się do najbliższej sekundy!

var returnElapsedTime = function(epoch) {
  //We are assuming that the epoch is in seconds
  var hours = epoch / 3600,
      minutes = (hours % 1) * 60,
      seconds = (minutes % 1) * 60;
  return Math.floor(hours) + ":" + Math.floor(minutes) + ":" + Math.round(seconds);
}


1

Ten napisałem niedawno dla MM: SS. Nie jest to dokładnie takie pytanie, ale jest to inny format jednowarstwowy.

const time = 60 * 2 + 35; // 2 minutes, 35 seconds
const str = (~~(time / 60) + "").padStart(2, '0') + ":" + (~~((time / 60) % 1 * 60) + "").padStart(2, '0');

str // 02:35

Edycja: Zostało to dodane dla odmiany, ale najlepszym rozwiązaniem tutaj jest https://stackoverflow.com/a/25279399/639679 poniżej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.