JavaScript od sekund do minut i sekund

170

To częsty problem, ale nie wiem, jak go rozwiązać. Poniższy kod działa dobrze.

var mind = time % (60 * 60);
var minutes = Math.floor(mind / 60);

var secd = mind % 60;
var seconds = Math.ceil(secd);

Jednak gdy dojdę do 1 godziny lub 3600 sekund, zwraca 0 minut i 0 sekund. Jak mogę tego uniknąć, żeby zwracało wszystkie minuty?

Dzięki

James Moore
źródło
Dzieje się tak, ponieważ gdy czas = 3600, 3600% 3600 jest zawsze równe 0 ... więc wszystko inne będzie równe 0 zgodnie z twoimi obliczeniami.
MSI

Odpowiedzi:

338

Aby uzyskać liczbę pełnych minut, podziel łączną liczbę sekund przez 60 (60 sekund / minutę):

var minutes = Math.floor(time / 60);

Aby otrzymać pozostałe sekundy, pomnóż pełne minuty przez 60 i odejmij od całkowitej liczby sekund:

var seconds = time - minutes * 60;

Teraz, jeśli chcesz również uzyskać pełne godziny, najpierw podziel całkowitą liczbę sekund przez 3600 (60 minut / godzinę · 60 sekund / minutę), a następnie oblicz pozostałe sekundy:

var hours = Math.floor(time / 3600);
time = time - hours * 3600;

Następnie obliczasz pełne minuty i pozostałe sekundy.

Premia:

Użyj poniższego kodu, aby dobrze wydrukować czas (sugerowany przez Dru)

function str_pad_left(string,pad,length) {
    return (new Array(length+1).join(pad)+string).slice(-length);
}

var finalTime = str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);
Gumbo
źródło
57
Trochę lepiej jest uzyskać pozostałe sekundy, wykonując polecenie „var seconds = time% 60”.
Edward D'Souza
11
@Radio dodaj wiodące zera za pomocą function str_pad_left(string,pad,length){ return (new Array(length+1).join(pad)+string).slice(-length); } var finalTime = str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);
Dru
1
To rozwiązanie nie zadziała dla ujemnych wartości time. Jeśli na przykład wpiszesz -1 sekund, otrzymasz -1 minutę i 59 sekund wstecz ...
Pylinux
5
Jaki jest sens posiadania negatywu time? Logicznie rzecz biorąc, różnica czasu jest zawsze dodatnia
mcont
4
Możesz użyć modułu, aby uzyskać liczbę sekund, moim zdaniem jest bardziej czytelny. var seconds = time % 60
JCM
106

Kolejne fantazyjne rozwiązanie:

function fancyTimeFormat(duration)
{   
    // Hours, minutes and seconds
    var hrs = ~~(duration / 3600);
    var mins = ~~((duration % 3600) / 60);
    var secs = ~~duration % 60;

    // Output like "1:01" or "4:03:59" or "123:03:59"
    var ret = "";

    if (hrs > 0) {
        ret += "" + hrs + ":" + (mins < 10 ? "0" : "");
    }

    ret += "" + mins + ":" + (secs < 10 ? "0" : "");
    ret += "" + secs;
    return ret;
}

~~jest skrótem Math.floor, zobacz ten link, aby uzyskać więcej informacji

Wypróbuj online

Vishal
źródło
14
Co to ma znaczyć ~~?
mcont
9
To podstawowy shorhand dla Math.floor, zobacz ten link .
okrążenie
Działa dobrze ..... :) Wartość można zaokrąglić w ten sposób hrs = hrs.toFixed (0); mins = mins.toFixed (0); secs = secs.toFixed (0);
Abdul Khaliq
1
Dzięki za to rozwiązanie! Dodałem time = math.round(time)do pierwszego wiersza, aby uzyskać zaokrąglone sekundy.
fotoflo,
To jest bardziej poprawne rozwiązanie. Jak wspomniano powyżej, rozwiązanie z największą liczbą głosów na tej stronie wyświetla 180 sekund jako 2m60s.
SongBox
71

Dla osób, które mają nadzieję na szybkie, proste, a tym samym krótkie rozwiązanie formatowania sekund na M:SS:

function fmtMSS(s){return(s-(s%=60))/60+(9<s?':':':0')+s}

zrobić ..
Funkcja przyjmuje alboNumber (korzystny) lub A String(2 konwersja „kar”, który może zmniejszyć o połowę przez poprzedzenie +argument wywołanie funkcji dla sna przykład: fmtMSS(+strSeconds)), co stanowi całkowite dodatnie sekund sjako argument.

Przykłady:

fmtMSS(    0 );  //   0:00
fmtMSS(   '8');  //   0:08
fmtMSS(    9 );  //   0:09
fmtMSS(  '10');  //   0:10
fmtMSS(   59 );  //   0:59
fmtMSS( +'60');  //   1:00
fmtMSS(   69 );  //   1:09
fmtMSS( 3599 );  //  59:59
fmtMSS('3600');  //  60:00
fmtMSS('3661');  //  61:01
fmtMSS( 7425 );  // 123:45

Awaria:

function fmtMSS(s){   // accepts seconds as Number or String. Returns m:ss
  return( s -         // take value s and subtract (will try to convert String to Number)
          ( s %= 60 ) // the new value of s, now holding the remainder of s divided by 60 
                      // (will also try to convert String to Number)
        ) / 60 + (    // and divide the resulting Number by 60 
                      // (can never result in a fractional value = no need for rounding)
                      // to which we concatenate a String (converts the Number to String)
                      // who's reference is chosen by the conditional operator:
          9 < s       // if    seconds is larger than 9
          ? ':'       // then  we don't need to prepend a zero
          : ':0'      // else  we do need to prepend a zero
        ) + s ;       // and we add Number s to the string (converting it to String as well)
}

Uwaga: Ujemny zakres można dodać, poprzedzając (0>s?(s=-s,'-'):'')+wyrażenie zwracane (w rzeczywistości też (0>s?(s=-s,'-'):0)+zadziała).

GitaarLAB
źródło
Sugerowałbym dodanie Math.floor(s)do ostatniej linii, aby uzyskać czystsze wyniki. I tak działa świetnie, dzięki!
Diego Fortes
@PossessWithin: Nie, NIE powinieneś "dodawać Math.floor (s) do ostatniej linii" (fragmentu-podziału) z wielu powodów, przede wszystkim dlatego , że wprowadziłoby to błąd dla wartości pomiędzy 9i 10bez dalszych modyfikacji; jeśli wpiszesz na przykład, 69.25wynik będzie wyglądał 1:9zamiast 1:09! Ta funkcja (dla której wyraźnie określiłem całkowite sekundy) jest przeznaczona i pięknie wykonana jako narzędzie do chrupania o wysokiej wydajności / `` silnik '' (nie dla rozmiaru ninja-golf) i jako taka uważam za niewłaściwe obciążanie tego silnika niepotrzebną weryfikacją / cleanup / filtering ...
GitaarLAB
... pracy (jak NaN, +/-Infinityitd.) I zaokrąglenia opcje , które powinny być wykonywane przez programistę przed wywołaniem funkcji, w zależności od potrzeb konkretnych i możliwych wartościach wejściowych, że aplikacja może spotkać! Oczywiście możesz to załatać, jeśli wiedza domeny o oczekiwanych wartościach wejściowych mówi, że twój konkretny przypadek użycia prawie zawsze otrzymuje wartości zmiennoprzecinkowe, a testowanie wydajności wskazuje, że twoja aplikacja. W twoim przypadku, gdy chcesz
łatać
... zmodyfikuj (9<s?':':':0')do (10>s?':0':':')(dodając 1 znak, ale „poświęcając” 5 z 6 prawdziwych ścieżek na fałszywe ścieżki) LUB (10<=s?':':':0')(dodając 2 znaki, ale zachowując 5 z 6 prawdziwych ścieżek). Następnie radzę zmienić ostateczne zakończenie +sna +(s|0) zamiast Math.floor(s) , aby nie zniszczyć piękna braku konieczności rozstrzygania i sprawdzania, Math.floor podczas gdy nadal działa poprawnie w całym 53-bitowym +/-MAX_SAFE_INTEGERzakresie zamiast „tylko” 32-bitowego (bez znaku) lub 31-bitowego (ze znakiem)! Pamiętaj, że ABS(s)magnetude na pewno będzie mniejszy niż 60, więc podpisany ...
GitaarLAB
... podpisany bitowy OR jest bezpieczny. Należy również zauważyć, że ta konkretna modyfikacja bez uwzględnienia pozostałych sekund spowodowałaby, że funkcja wyświetlałaby ułamki sekund bez końcowych zer ułamkowych, ale często będzie miała więcej niż 3 znaczące niezerowe cyfry ułamkowe, które prawdopodobnie również musiałbyś obsługiwać. Wreszcie, w połączeniu z opcjonalnym kodem pre-fix dla zakresu ujemnego, ta konkretna modyfikacja skutecznie TRUNCUJE sekundy (a nie DORADZANIE ich). PS: PFFT, whoever came up with just 512 char limit for any meaningful comment should be...
GitaarLAB
21

Możesz także użyć natywnego obiektu Date:

var date = new Date(null);
date.setSeconds(timeInSeconds);

// retrieve time ignoring the browser timezone - returns hh:mm:ss
var utc = date.toUTCString();
// negative start index in substr does not work in IE 8 and earlier
var time = utc.substr(utc.indexOf(':') - 2, 8)

// retrieve each value individually - returns h:m:s
var time = date.getUTCHours() + ':' + date.getUTCMinutes() + ':' +  date.getUTCSeconds();

// does not work in IE8 and below - returns hh:mm:ss
var time = date.toISOString().substr(11, 8);

// not recommended - only if seconds number includes timezone difference
var time = date.toTimeString().substr(0, 8);

Oczywiście to rozwiązanie działa tylko dla timeInSeconds krótszych niż 24 godziny;)

hamczu
źródło
1
Nie przyszło mi do głowy, aby pozwolić obiektowi Date obsługiwać formatowanie. Mniej elastyczny, ale jeśli chcesz hh: mm: ss (lub jego podrozdział), to świetnie
MartinAnsty
Próbowałem tego z 25 sekundami i wróciło 01:00:25, co odpowiada 1 godzinie i 25 sekundom.
timstermatic
Tak, prawdopodobnie z powodu Twojej strefy czasowej. Zaktualizowałem rozwiązanie do obsługi tej sprawy.
hamczu
datemoże być również skonstruowany jakovar date = new Date(timeInSeconds * 1000)
Nuno André
20

Najlepszy wariant 2019

Format hh:mm:ss

console.log(display(60 * 60 * 2.5 + 25)) // 2.5 hours + 25 seconds

function display (seconds) {
  const format = val => `0${Math.floor(val)}`.slice(-2)
  const hours = seconds / 3600
  const minutes = (seconds % 3600) / 60

  return [hours, minutes, seconds % 60].map(format).join(':')
}

Илья Зеленько
źródło
hmmm, secondsjest const. nie możesz go ponownie przypisać.
ronapelbaum
@ronapelbaum ten argument, nie jest stały, nie rozumiem, co masz na myśli
Илья Зеленько
@ronapelbaum, jeśli przypiszesz sekundy zamiast otrzymywać je jako parametr, którego musisz użyć let, np. function display (state) { let seconds = state.seconds; ... }czy to może być przyczyną błędu?
retrovertigo
Parametr funkcji powinien być traktowany jako stała. Kiedy używasz %=, ponownie przypisujesz ten parametr. Po prostu użyjseconds%60
ronapelbaum
16
function secondsToMinutes(time){
    return Math.floor(time / 60)+':'+Math.floor(time % 60);
}
El0din
źródło
3
Można to poprawić, wypełniając zero sekund: function secondsToMinutes(time){ return Math.floor(0 / 60)+':'+('0'+Math.floor(0 % 60)).slice(-2); }
Kus
miły! dziękuję @Kus. Może po prostu chcesz zastąpić te dwa 0sz time, jestem poprawna?
mikey
2
@mikey oops! Tak,function secondsToMinutes(time){ return Math.floor(time / 60) + ':' + ('0' + Math.floor(time % 60)).slice(-2) }
Kus,
12

Aby dodać wiodące zera, po prostu zrobiłbym:

var minutes = "0" + Math.floor(time / 60);
var seconds = "0" + (time - minutes * 60);
return minutes.substr(-2) + ":" + seconds.substr(-2);

Ładnie i krótko

Ids Klijnsma
źródło
9

Wyczyść jedną wkładkę za pomocą ES6


const secondsToMinutes = seconds => Math.floor(seconds / 60) + ':' + ('0' + Math.floor(seconds % 60)).slice(-2);
Sam Logan
źródło
6

Jedna wkładka (nie działa z godzinami):

 function sectostr(time) {
    return ~~(time / 60) + ":" + (time % 60 < 10 ? "0" : "") + time % 60;
 }
Dillon
źródło
4

Sekundy do h: mm: ss

var hours = Math.floor(time / 3600);
time -= hours * 3600;

var minutes = Math.floor(time / 60);
time -= minutes * 60;

var seconds = parseInt(time % 60, 10);

console.log(hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds));
kayz1
źródło
Czy ktoś może minutes < 10 ? '0' + minutes : minutesmi wyjaśnić , zakładając tylko podstawową wiedzę js?
Zediiiii
Jeśli minuty są jednocyfrowe (<10), dodaj na początku zero, w przeciwnym razie nie.
kayz1
To pomaga! Nie zdawałem sobie sprawy, że „?” był operatorem trójskładnikowym w js.
Zediiiii
4

Następująca funkcja pomoże Ci uzyskać dni, godziny, minuty, sekundy

toDDHHMMSS(inputSeconds){
        const Days = Math.floor( inputSeconds / (60 * 60 * 24) );
        const Hour = Math.floor((inputSeconds % (60 * 60 * 24)) / (60 * 60));
        const Minutes = Math.floor(((inputSeconds % (60 * 60 * 24)) % (60 * 60)) / 60 );
        const Seconds = Math.floor(((inputSeconds % (60 * 60 * 24)) % (60 * 60)) % 60 );
        let ddhhmmss  = '';
        if (Days > 0){
            ddhhmmss += Days + ' Day ';
        }
        if (Hour > 0){
            ddhhmmss += Hour + ' Hour ';
        }

        if (Minutes > 0){
            ddhhmmss += Minutes + ' Minutes ';
        }

        if (Seconds > 0){
            ddhhmmss += Seconds + ' Seconds ';
        }
        return ddhhmmss;
    }
alert( toDDHHMMSS(2000));
sivamani s
źródło
Podoba mi się ten. Zmieniłem if (Days > 0){ ddhhmmss += Days + ' Day '; }się if (Days > 0) {ddhhmmss += Days === 1 ? Days + ' Day ' : Days + ' Days '};powiedzieć 1 Day, 2 Days, 3 Daysitd. Podobnie można zrobić dla innych.
Ste
4

Po tym wszystkim jeszcze jedno proste rozwiązanie:

const time = new Date(null);
time.setSeconds(7530);
console.log(time.getHours(), time.getMinutes(), time.getSeconds());
user2734839
źródło
1
Używanie time.setSeconds(1);zwrotów, 1 0 1gdy powinno 0 0 1.
Ste
3

Inne, ale znacznie bardziej eleganckie rozwiązanie jest następujące:

/**
 * Convert number secs to display time
 *
 * 65 input becomes 01:05.
 *
 * @param Number inputSeconds Seconds input.
 */
export const toMMSS = inputSeconds => {
    const secs = parseInt( inputSeconds, 10 );
    let minutes = Math.floor( secs / 60 );
    let seconds = secs - minutes * 60;

    if ( 10 > minutes ) {
        minutes = '0' + minutes;
    }
    if ( 10 > seconds ) {
        seconds = '0' + seconds;
    }

    // Return display.
    return minutes + ':' + seconds;
};
Ahmad Awais
źródło
2

Aby dodać zera, naprawdę nie widzę potrzeby posiadania pełnej innej funkcji, którą można po prostu użyć na przykład

var mins=Math.floor(StrTime/60);
var secs=StrTime-mins * 60;
var hrs=Math.floor(StrTime / 3600);
RoundTime.innerHTML=(hrs>9?hrs:"0"+hrs) + ":" + (mins>9?mins:"0"+mins) + ":" + (secs>9?secs:"0"+secs);

Właśnie dlatego mamy na pierwszym miejscu instrukcje warunkowe.

(warunek? jeśli prawda: jeśli fałsz), więc jeśli przykładowe sekundy są większe niż 9, pokaż tylko sekundy, w przeciwnym razie dodaj ciąg 0 przed nim.

Los
źródło
2

spróbuj tego: Zamień sekundę na HOURS, MIN i SEC.

function convertTime(sec) {
    var hours = Math.floor(sec/3600);
    (hours >= 1) ? sec = sec - (hours*3600) : hours = '00';
    var min = Math.floor(sec/60);
    (min >= 1) ? sec = sec - (min*60) : min = '00';
    (sec < 1) ? sec='00' : void 0;

    (min.toString().length == 1) ? min = '0'+min : void 0;    
    (sec.toString().length == 1) ? sec = '0'+sec : void 0;    

    return hours+':'+min+':'+sec;
}
Sushil
źródło
2

var seconds = 60;
var measuredTime = new Date(null);
measuredTime.setSeconds(seconds); // specify value of SECONDS
var Time = measuredTime.toISOString().substr(11, 8);
document.getElementById("id1").value = Time;
<div class="form-group">
  <label for="course" class="col-md-4">Time</label>
  <div class="col-md-8">
    <input type="text" class="form-control" id="id1" name="field">Min
  </div>
</div>

Anmol Devta
źródło
2

Jeśli używasz Moment.js , możesz użyć wbudowanego Durationobiektu

const duration = moment.duration(4825, 'seconds');

const h = duration.hours(); // 1
const m = duration.minutes(); // 20
const s = duration.seconds(); // 25
Gil Epshtain
źródło
2

AKTUALIZACJA 2020

Korzystając z podstawowej matematyki i prostego JavaScript, można to zrobić w zaledwie kilku wierszach kodu.

PRZYKŁAD - Konwertuj 7735 secondsna HH:MM:SS.


MATEMATYKA:

Obliczenia wykorzystują:

  1. Math.floor()- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

Math.floor()Zwraca największą liczbę całkowitą mniejszą lub równą określonej liczby.

  1. %operator arytmetyczny (Remainder) - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder

Operator reszty zwraca resztę pozostałą po podzieleniu jednego operandu przez drugi operand. Zawsze ma znak dywidendy.

Sprawdź kod poniżej. Sekundy są dzielone przez, 3600aby uzyskać liczbę godzin i pozostałą część, która jest używana do obliczania liczby minut i sekund.

HOURS => 7735 / 3600 = 2 remainder 535

MINUTES => 535 / 60 = 8 remainder 55

SECONDS => 55


WIODĄCE ZERA:

Wiele odpowiedzi tutaj używać skomplikowanych metod, aby pokazać liczbę godzin, minut i sekund w odpowiedni sposób z zerem - 45, 04itd. Można to zrobić za pomocą padStart(). Działa to w przypadku ciągów, więc liczbę należy przekonwertować na ciąg przy użyciu toString().

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

padStart()Sposób tarcze bieżący łańcuch z innym ciągiem (kilka razy, jeśli jest taka potrzeba), aż powstały łańcuch osiąga daną długość. Wypełnienie jest stosowane od początku bieżącego ciągu.


KOD:

function secondsToTime(e){
    var h = Math.floor(e / 3600).toString().padStart(2,'0'),
        m = Math.floor(e % 3600 / 60).toString().padStart(2,'0'),
        s = Math.floor(e % 60).toString().padStart(2,'0');
    
    return h + ':' + m + ':' + s;
}

console.log(secondsToTime(7735));  //02:08:55

/*
secondsToTime(SECONDS) => HH:MM:SS 

secondsToTime(8)       => 00:00:08 
secondsToTime(68)      => 00:01:08
secondsToTime(1768)    => 00:29:28
secondsToTime(3600)    => 01:00:00
secondsToTime(5296)    => 01:28:16
secondsToTime(7735)    => 02:08:55
secondsToTime(45296)   => 12:34:56
secondsToTime(145296)  => 40:21:36
secondsToTime(1145296) => 318:08:16
*/

Jakub Muda
źródło
1

Zrobiłeś wystarczająco dużo kodu, aby śledzić części minut i sekund.

Możesz dodać liczbę godzin do:

var hrd = time % (60 * 60 * 60);
var hours = Math.floor(hrd / 60);

var mind = hrd % 60;
var minutes = Math.floor(mind / 60);

var secd = mind % 60;
var seconds = Math.ceil(secd);

var moreminutes = minutes + hours * 60

Dałoby ci to również to, czego potrzebujesz.

Nevyn
źródło
Próbowałem tego, używając „czasu” jako sekund i nie zadziałało. Na przykład 975 s oznacza hrd = 975, co oznacza, że ​​godzinami jest 16.
Spedge,
1

Myślałem o szybszym sposobie zrobienia tego i oto, co wymyśliłem

var sec = parseInt(time);
var min=0;
while(sec>59){ sec-=60; min++;}

Jeśli chcemy przeliczyć „czas” na minuty i sekundy, na przykład:

// time = 75,3 sec
var sec = parseInt(time); //sec = 75
var min=0;
while(sec>59){ sec-=60; min++;} //sec = 15; min = 1
Kamen Kotsev
źródło
1

Umieść moje dwa centy w:

function convertSecondsToMinutesAndSeconds(seconds){
            var minutes;
            var seconds;
            minutes = Math.floor(seconds/60);
            seconds = seconds%60;

            return [minutes, seconds];
        }

Więc to :

var minutesAndSeconds = convertSecondsToMinutesAndSeconds(101);

Będzie mieć następujący wynik:

[1,41];

Następnie możesz wydrukować to w ten sposób:

console.log('TIME : ' +  minutesSeconds[0] + ' minutes, ' + minutesSeconds[1] + ' seconds');

//TIME : 1 minutes, 41 seconds
thatOneGuy
źródło
1

strftime.js ( strftime github ) to jedna z najlepszych bibliotek formatujących czas. Jest niezwykle lekki - 30 KB - i skuteczny. Używając go, możesz łatwo przekształcić sekundy w czas w jednej linii kodu, opierając się głównie na natywnej klasie Date.

Podczas tworzenia nowej daty każdy opcjonalny argument jest pozycyjny w następujący sposób:

new Date(year, month, day, hours, minutes, seconds, milliseconds);

Więc jeśli zainicjujesz nową datę ze wszystkimi argumentami równymi zero do sekund, otrzymasz:

var seconds = 150;
var date = new Date(0,0,0,0,0,seconds);
=> Sun Dec 31 1899 00:02:30 GMT-0500 (EST)

Możesz zobaczyć, że 150 sekund to 2 minuty i 30 sekund, jak widać w utworzonej dacie. Następnie używając formatu strftime („% M:% S” zamiast „MM: SS”), wyświetli ciąg minut.

var mm_ss_str = strftime("%M:%S", date);
=> "02:30"

W jednej linii wyglądałoby to tak:

var mm_ss_str = strftime('%M:%S', new Date(0,0,0,0,0,seconds));
=> "02:30"

Dodatkowo umożliwiłoby to wymienną obsługę HH: MM: SS i MM: SS w oparciu o liczbę sekund. Na przykład:

# Less than an Hour (seconds < 3600)
var seconds = 2435;
strftime((seconds >= 3600 ? '%H:%M:%S' : '%M:%S'), new Date(0,0,0,0,0,seconds));
=> "40:35"

# More than an Hour (seconds >= 3600)
var seconds = 10050;
strftime((seconds >= 3600 ? '%H:%M:%S' : '%M:%S'), new Date(0,0,0,0,0,seconds));
=> "02:47:30"

Oczywiście możesz po prostu przekazać dowolny format do strftime, jeśli chcesz, aby ciąg czasu był mniej lub bardziej semantyczny.

var format = 'Honey, you said you\'d be read in %S seconds %M minutes ago!';
strftime(format, new Date(0,0,0,0,0,1210));
=> "Honey, you said you'd be read in 10 seconds 20 minutes ago!"

Mam nadzieję że to pomoże.

Sebastian Scholl
źródło
1
export function TrainingTime(props) {
    const {train_time } = props;
    const hours = Math.floor(train_time/3600);
    const minutes = Math.floor((train_time-hours * 3600) / 60);
    const seconds = Math.floor((train_time%60));

    return `${hours} hrs  ${minutes} min  ${seconds} sec`;
}
Abdul Rehman
źródło
2
Witamy w Stack Overflow. Zgodnie z sugestią @PhilRoggenbuck pomocne byłoby wyjaśnienie. Aby uzyskać więcej informacji, przeczytaj stackoverflow.com/help/how-to-answer
Mikkel
0

Proponuję inne rozwiązanie:

function formatTime(nbSeconds, hasHours) {
    var time = [],
        s = 1;
    var calc = nbSeconds;

    if (hasHours) {
        s = 3600;
        calc = calc / s;
        time.push(format(Math.floor(calc)));//hour
    }

    calc = ((calc - (time[time.length-1] || 0)) * s) / 60;
    time.push(format(Math.floor(calc)));//minute

    calc = (calc - (time[time.length-1])) * 60;
    time.push(format(Math.round(calc)));//second


    function format(n) {//it makes "0X"/"00"/"XX"
        return (("" + n) / 10).toFixed(1).replace(".", "");
    }

    //if (!hasHours) time.shift();//you can set only "min: sec"

    return time.join(":");
};
console.log(formatTime(3500));//58:20
console.log(formatTime(305));//05:05
console.log(formatTime(75609, true));//21:00:09
console.log(formatTime(0, true));//00:00:00

Sherali Turdiyev
źródło
0

Wiem, że zostało to rozwiązane na wiele sposobów. Potrzebowałem tej funkcji dla skryptu After Effects, w którym prędkość lub zanieczyszczenie przestrzeni nazw nie jest problemem. Rzucam to tutaj dla kogoś, kto potrzebuje czegoś podobnego. Napisałem też kilka testów i działało dobrze. Oto kod:

Number.prototype.asTime = function () {
    var hour = Math.floor(this / 3600),
        min = Math.floor((this - hour * 3600) / 60),
        sec = this - hour * 3600 - min * 60,
        hourStr, minStr, secStr;
    if(hour){
        hourStr = hour.toString(),
        minStr = min < 9 ? "0" + min.toString() : min.toString();
        secStr = sec < 9 ? "0" + sec.toString() : sec.toString();
        return hourStr + ":" + minStr + ":" + secStr + "hrs";
    }
    if(min){
        minStr = min.toString();
        secStr = sec < 9 ? "0" + sec.toString() : sec.toString();
        return  minStr + ":" + secStr + "min";
    }
    return sec.toString() + "sec";
}
vladblindu
źródło