260

This is a common problem but I'm not sure how to solve it. The code below works fine.

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

However, when I get to 1 hour or 3600 seconds it returns 0 minutes and 0 seconds. How can I avoid this so it returns all the minutes?

Nimantha
  • 6,405
  • 6
  • 28
  • 69
James Moore
  • 3,417
  • 4
  • 20
  • 18
  • 1
    Thats because when time = 3600, 3600%3600 is always 0...so everything else will be 0 according to your calculation. – MSI Sep 17 '10 at 06:59

33 Answers33

448

To get the number of full minutes, divide the number of total seconds by 60 (60 seconds/minute):

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

And to get the remaining seconds, multiply the full minutes with 60 and subtract from the total seconds:

const seconds = time - minutes * 60;

Now if you also want to get the full hours too, divide the number of total seconds by 3600 (60 minutes/hour · 60 seconds/minute) first, then calculate the remaining seconds:

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

Then you calculate the full minutes and remaining seconds.

Bonus:

Use the following code to pretty-print the time (suggested by Dru):

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

const finalTime = str_pad_left(minutes, '0', 2) + ':' + str_pad_left(seconds, '0', 2);
double-beep
  • 5,031
  • 17
  • 33
  • 41
Gumbo
  • 643,351
  • 109
  • 780
  • 844
  • 75
    It's a bit cleaner to get remaining seconds by doing 'var seconds = time % 60'. – Edward D'Souza Dec 08 '11 at 15:20
  • How to add leading zero to a seconds? Result shows up as 0:5. I want it to be 0:05 – Alex G Apr 01 '12 at 12:49
  • 14
    @Radio add leading zeros using `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 Dec 06 '12 at 07:20
  • 1
    This solution won't work for negative values of `time`. If you for instance input -1 seconds, you get -1minute and 59 seconds back... – Pylinux Oct 20 '13 at 18:10
  • 9
    What's the sense of having negative `time`? Logically a time difference is always positive – mcont Dec 29 '14 at 19:08
  • 1
    Don't forget to use `secs = (secs < 10) ? '0' + secs : secs;` – Arthur Kushman Dec 30 '14 at 07:09
  • 4
    You can use modulus to get the number of seconds, it's more readable in my opinion. ``var seconds = time % 60`` – jonathancardoso Jun 10 '16 at 19:27
  • @Matteo I have a timer that starts at -120 seconds, counting down for the user. -01:30... down to 00:00 at which point the game starts, and begins to count up till completion. – Dustin Graham Jan 09 '17 at 23:30
  • Do you maybe know how to get milliseconds also here ? I have same issue, but i need to get minutes, seconds and milliseconds from seconds. I would appreciate if anyone could help with that – Sahbaz Dec 27 '18 at 01:10
  • This is great but for something that's exactly 180 seconds (which is as chance would have it the first thing I've used this for) you get 2m60s - which is a bit rubbish. Also when counting up in realtime you get 1.58, 1.59, 1.60, 2.00 – SongBox Oct 19 '19 at 10:25
  • 6
    You can use the built-in JavaScript `string.padStart()` method to pad a single number with a zero. –  Mar 03 '20 at 07:19
  • I use this one-liner to get `62.234` seconds to show as `1:02`. It’s a bit over-engineered: ```[seconds / 60, seconds % 60].map(Math.floor).join(':')``` – rnmp Jul 28 '20 at 23:10
  • @mcont A time difference might not always be positive, it depends on what times you're comparing and what sort of time source you're using as a basis. – Pharap Jul 08 '21 at 15:05
158

Another fancy solution:

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

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

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

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

  return ret;
}

console.log(
  fancyTimeFormat(1),
  fancyTimeFormat(10),
  fancyTimeFormat(100),
  fancyTimeFormat(1000),
  fancyTimeFormat(10000),
);

~~ is a shorthand for Math.floor, see this link for more info

double-beep
  • 5,031
  • 17
  • 33
  • 41
Vishal
  • 19,879
  • 23
  • 80
  • 93
  • 30
    What's the meaning of `~~`? – mcont Dec 29 '14 at 19:03
  • 15
    It's a basic shorhand for `Math.floor`, see [this link](http://rocha.la/JavaScript-bitwise-operators-in-practice). – lapin May 20 '15 at 11:10
  • Its work fine..... :) You can round the value like this way hrs = hrs.toFixed(0); mins = mins.toFixed(0); secs = secs.toFixed(0); – Abdul Khaliq Jun 25 '15 at 07:50
  • 2
    Thanks for this solution! I added `time = math.round(time)` to the first line to give me rounded seconds. – fotoflo Feb 06 '18 at 00:53
  • 1
    This is the more correct solution. As stated above, the solution with the most votes on this page displays 180 seconds as 2m60s. – SongBox Oct 19 '19 at 10:35
112

For people dropping in hoping for a quick simple and thus short solution to format seconds into M:SS :

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

done..
The function accepts either a Number (preferred) or a String (2 conversion 'penalties' which you can halve by prepending + in the function call's argument for s as in: fmtMSS(+strSeconds)), representing positive integer seconds s as argument.

Examples:

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

Breakdown:

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

Note: Negative range could be added by prepending (0>s?(s=-s,'-'):'')+ to the return expression (actually, (0>s?(s=-s,'-'):0)+ would work as well).

GitaarLAB
  • 14,536
  • 11
  • 60
  • 80
  • I'd suggest adding `Math.floor(s)` to the last line for cleaner results. Working great anyway, thanks! – Diego Fortes Apr 26 '19 at 15:44
  • @PossessWithin: No, you should **NOT** "add Math.floor(s) to the last line" (of the breakdown-snippet) for multiple reasons, foremost because *that would introduce a bug* for values between `9` and `10` without further modifications; if you entered for example `69.25` then the output would be `1:9` instead of `1:09` ! This function (for which I explicitly specified integer seconds) is intended and lovingly crafted as high-perf crunching tool/'engine' (not ninja-golfed for size) and as such I consider it in-apropriate to burden that engine with unneeded verification/cleanup/filtering ... – GitaarLAB Jun 24 '19 at 00:00
  • ... work (like `NaN`, `+/-Infinity` etc.) **and rounding-options** which should be done by the programmer, prior to calling the function, based on the specific needs and possible input-values that the application can encounter! Naturally you are free to patch it in if your *domain knowledge about expected input-values* dictates that your particular use-case almost always receives floating point values *and* perf-testing indicates that your application. In your case where you wish to patch in *only flooring of positive values* you MUST .... – GitaarLAB Jun 24 '19 at 00:02
  • 1
    ... modify `(9s?':0':':')` (adding 1 char but 'sacrificing' 5 out of 6 true-paths to false-paths) OR `(10<=s?':':':0')` (adding 2 chars but maintaining 5 out of 6 true paths). Then *I advise* to change that final trailing `+s` to `+(s|0)` *instead of* `Math.floor(s)`, as to not destroy the beauty of *not* needing to resolve and call `Math.floor` *while* still operating correctly over the *entire* 53bit `+/-MAX_SAFE_INTEGER` range instead of 'just' 32bit (unsigned) or 31bit (signed) range! Note that `ABS(s)` magnetude is guaranteed to be smaller than 60, so the signed... – GitaarLAB Jun 24 '19 at 00:03
  • ... signed bitwise OR is safe. Also note that this particular modification *without flooring the remaining seconds* would make the function output fractional seconds without trailing fractional zeroes, *but* will often have more than 3 significant non-zero frational digits which you'd probably need to handle as well. Finally, when combined with the optional pre-fix code for negative range, this particular modification would effectively *TRUNCate* the seconds (not *FLOORing* them). `PS: PFFT, whoever came up with just 512 char limit for any meaningful comment should be...` – GitaarLAB Jun 24 '19 at 00:04
57

2020 UPDATE

Using basic math and simple javascript this can be done in just a few lines of code.

EXAMPLE - Convert 7735 seconds to HH:MM:SS.


MATH:

Calculations use:

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

The Math.floor() function returns the largest integer less than or equal to a given number.

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

The remainder operator returns the remainder left over when one operand is divided by a second operand. It always takes the sign of the dividend.

Check out code below. Seconds are divided by 3600 to get number of hours and a remainder, which is used to calculate number of minutes and seconds.

HOURS => 7735 / 3600 = 2 remainder 535

MINUTES => 535 / 60 = 8 remainder 55

SECONDS => 55


LEADING ZEROS:

Many answers here use complicated methods to show number of hours, minutes and seconds in a proper way with leading zero - 45, 04 etc. This can be done using padStart(). This works for strings so the number must be converted to string using toString().

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

The padStart() method pads the current string with another string (multiple times, if needed) until the resulting string reaches the given length. The padding is applied from the start of the current string.


CODE:

function secondsToTime(e){
    const 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;
    //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
  • 6,008
  • 10
  • 37
  • 56
  • 1
    This is so clean! The earlier answers play around with too much string/array manipulation for my taste. – RockyK Aug 29 '20 at 18:08
  • 1
    Unfortunately, your code misses 1 second, try to convert the 3599.99999998, this will return 00:59:59, how can we solve this? – Irfan Ahmed Aug 04 '21 at 14:07
  • This code works for integers and that was the original question. For decimals you need to make some more calculations. – Jakub Muda Aug 04 '21 at 14:25
32

2019 best variant

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(':')
}
  • hmmm, `seconds` is const. you can't reassign it. – ronapelbaum Apr 28 '19 at 13:15
  • @ronapelbaum this argument, not constant, I do not understand what you mean – Илья Зеленько Jun 01 '19 at 12:45
  • @ronapelbaum if you assign the seconds instead of getting them as parameter you have to use `let`, e.g. `function display (state) { let seconds = state.seconds; ... }` was that maybe where your error came from? – retrovertigo Jun 24 '19 at 04:15
  • 1
    A function param should be treated as const. When you use `%=` you're re-assigning this param. Just use `seconds%60` – ronapelbaum Jul 02 '19 at 17:34
  • 1
    @ronapelbaum Should a _param_ always be treated as const? Isn’t it convenient sometimes for non-arrays/object literals that may suffer from mutations? – rnmp Jul 28 '20 at 23:18
  • 1
    @RolandoMurillo usually, pure functions are better. see https://stackoverflow.com/questions/41625399/how-to-handle-eslint-no-param-reassign-rule-in-array-prototype-reduce-function – ronapelbaum Oct 27 '20 at 11:59
24
function secondsToMinutes(time){
    return Math.floor(time / 60)+':'+Math.floor(time % 60);
}
El0din
  • 3,208
  • 3
  • 20
  • 31
  • 4
    This can be improved with zero padding the seconds: ```function secondsToMinutes(time){ return Math.floor(0 / 60)+':'+('0'+Math.floor(0 % 60)).slice(-2); }``` – Kus Dec 07 '17 at 06:00
  • nice! thank you @Kus. Just you might want to replace those two `0`s with `time`, am I correct? – mikey Feb 19 '18 at 23:20
  • 5
    @mikey oops! Yes, `function secondsToMinutes(time){ return Math.floor(time / 60) + ':' + ('0' + Math.floor(time % 60)).slice(-2) }` – Kus Feb 21 '18 at 22:38
22

You can also use native Date object:

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

Of course this solution works only for timeInSeconds less than 24 hours ;)

hamczu
  • 1,774
  • 12
  • 14
20

2023 update:

To add leading zeros, I would just do:

const secondsToMinSecPadded = time => {
  const minutes = `${Math.floor(time / 60)}`.padStart(2, "0");
  const seconds = `${time - minutes * 60}`.padStart(2, "0");
  return `${minutes}:${seconds}`;
};


console.log(secondsToMinSecPadded(241));

Nice and short

Ids Klijnsma
  • 442
  • 3
  • 9
14

Moment.js

If you are using Moment.js then you can use there built in Duration object

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

const h = duration.hours(); // 1
const m = duration.minutes(); // 20
const s = duration.seconds(); // 25
Gil Epshtain
  • 8,670
  • 7
  • 63
  • 89
11

Clean one liner using ES6


const secondsToMinutes = seconds => Math.floor(seconds / 60) + ':' + ('0' + Math.floor(seconds % 60)).slice(-2);

Sam Logan
  • 3,343
  • 2
  • 17
  • 13
9

The most concise method I found can be done using in just one line:

let timeString = `${timeInSeconds/60|0}:${timeInSeconds%60}`

Explanation

`${...}`
Template literals. Allows for expressions to be converted into a string from within the string itself.
Note: Incompatible with IE.

timeInSeconds/60|0
Takes the seconds and converts in into minutes (/60). This gives a rational number. From here it is truncated using the bitwise OR (|0)

timeInSeconds%60
Remainder (modulo). Gives the remainder of the variable divided by 60.


Hours

This method can be expanded to include hours like this:

let timeString = `${timeInSeconds/60/60|0}:${timeInSeconds/60%60|0}:${timeInSeconds%60}`

Repeating this process, you can even include days.

Diriector_Doc
  • 582
  • 1
  • 12
  • 28
  • I built on your version. to add trailing zeros: ``${resolution_duration_s / 60 | 0}:${resolution_duration_s % 60 < 10 ? "0" : ""}${resolution_duration_s % 60}`` and for additional trailing zero on minutes: ``${resolution_duration_s / 60 < 10 ? "0" : ""}${resolution_duration_s / 60 | 0}:${resolution_duration_s % 60 < 10 ? "0" : ""}${resolution_duration_s % 60}`` – Skratt May 07 '21 at 18:01
7

A one liner (doesnt work with hours):

 function sectostr(time) {
    return ~~(time / 60) + ":" + (time % 60 < 10 ? "0" : "") + time % 60;
 }
Dillon
  • 79
  • 1
  • 4
5

Seconds to 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
  • 7,260
  • 3
  • 53
  • 56
5

After all this, yet another simple solution:

const time = new Date(null);
time.setSeconds(7530);
console.log(time.getHours(), time.getMinutes(), time.getSeconds());
user2734839
  • 207
  • 3
  • 7
4

Another but much more elegant solution for this is as follows:

/**
 * 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
  • 33,440
  • 5
  • 74
  • 56
4

The Following function will help you to get Days , Hours , Minutes , seconds

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
  • 167
  • 1
  • 3
  • I like this one. I changed `if (Days > 0){ ddhhmmss += Days + ' Day '; }` to `if (Days > 0) {ddhhmmss += Days === 1 ? Days + ' Day ' : Days + ' Days '};` to say `1 Day`, `2 Days`, `3 Days` etc. Similar can be done for the others. – Ste May 21 '20 at 20:07
  • I add this: ddhhmmss += Days + ` Day${Days > 1 ? 's' : ''} `; – Diego Jul 24 '20 at 01:15
4
  function formatSeconds(s: number) {
    let minutes = ~~(s / 60);
    let seconds = ~~(s % 60);
    return minutes + ':' + seconds;
  }
3

For adding zeros I really don't see the need to have a full other function where you can simply use for example

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

Its why we have conditional statements in the first place.

(condition?if true:if false) so if example seconds is more than 9 than just show seconds else add a string 0 before it.

FaTe
  • 155
  • 3
  • 11
3

Try this:
Converting Second to HOURS, MIN and 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;
}
Nimantha
  • 6,405
  • 6
  • 28
  • 69
Sushil
  • 2,324
  • 1
  • 27
  • 26
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>
2

1 - Get rest of division using %. Now you have the seconds that don't complete a minute 2 - Subtract the seconds obtained in step 1 from the total. Now you have the minutes

For example, let's assume you have 700 seconds:

seconds = 700%60); //40 seconds
minutes = (700 - (700%60))/60; //11
//11:40
DEV Tiago França
  • 1,271
  • 9
  • 9
2

If you're after a formatted mm:ss time string, you can use the Date constructor and toLocaleTimeString():

const seconds = 157;

const timeString = new Date(seconds * 1000).toLocaleTimeString([], {
  minute: "numeric",
  second: "2-digit",
})

console.log(timeString);

Note that:

  • we create a new Date object using milliseconds, seconds * 1000: the Date constructor accepts a timestamp. Effectively, we're creating a date that is a few minutes after January 1st, 1970, 00:00:00 UTC. (But day doesn't matter, since we only use time)
  • the first parameter of toLocaleTimeString receives a string or array of locales. If left undefined, the user agent's default locale will be used
  • the second parameter takes a DateTimeFormat options object. In our case, if we want mm:ss (without leading zero for minutes), we pass { minute: "numeric", second: "2-digit" }. (If you're still seeing a leading zero for minutes, refer to this question and this answer.)
Robin Métral
  • 3,099
  • 3
  • 17
  • 32
1

I was thinking of a faster way to get this done and this is what i came up with

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

If we want to convert "time" to minutes and seconds, for example:

// 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
  • 303
  • 1
  • 7
1

Put my two cents in :

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

            return [minutes, seconds];
        }

So this :

var minutesAndSeconds = convertSecondsToMinutesAndSeconds(101);

Will have the following output :

[1,41];

Then you can print it like so :

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

//TIME : 1 minutes, 41 seconds
thatOneGuy
  • 9,977
  • 7
  • 48
  • 90
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`;
}
  • 2
    Welcome to Stack Overflow. As suggested by @PhilRoggenbuck, an explanation would help. For more info read https://stackoverflow.com/help/how-to-answer – Mikkel Aug 30 '18 at 08:52
1

I prefer thinking of Millisecond as its own unit, rather than as a subunit of something else. In that sense, it will have values of 0-999, so you're going to want to Pad three instead of two like I have seen with other answers. Here is an implementation:

function format(n) {
   let mil_s = String(n % 1000).padStart(3, '0');
   n = Math.trunc(n / 1000);
   let sec_s = String(n % 60).padStart(2, '0');
   n = Math.trunc(n / 60);
   return String(n) + ' m ' + sec_s + ' s ' + mil_s + ' ms';
}

console.log(format(241));

https://developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/String/padStart

ggorlen
  • 44,755
  • 7
  • 76
  • 106
Zombo
  • 1
  • 62
  • 391
  • 407
1

Day.js

If you use day.js, try this.

const dayjs = require('dayjs')
const duration = require('dayjs/plugin/duration') 
dayjs.extend(duration)

const time = dayjs.duration(100, 'seconds')

time.seconds() // 40
time.minutes() // 1
time.format('mm:ss') // 01:40
junho
  • 3,603
  • 3
  • 18
  • 25
1

Here's an ES6 version of the seconds to minutes and seconds conversion, with padding (00:00 format). It only accepts integer values for seconds and ~~(x) is the shorthand floor operation.

const padTime = n => ("" + n).padStart(2, 0);
const secondsToMinSec = time =>
  `${padTime(~~(time / 60))}:${padTime(time - ~~(time / 60) * 60)}`
;

for (let i = 0; i < 10; i++) {
  const seconds = ~~(Math.random() * 300);
  console.log(seconds, secondsToMinSec(seconds));
}
ggorlen
  • 44,755
  • 7
  • 76
  • 106
1

if you need to work with the result easily later this is what I use:

function seconds2hms(seconds, milliseconds) {
if(milliseconds) {
    seconds = Math.floor(seconds/1000);
}
return {h:~~(seconds / 3600),m:~~((seconds % 3600) / 60),s:~~seconds % 60}

}

(used Vishal's code)

Paul
  • 461
  • 4
  • 7
0

This Workes for Me

 const start_date=moment().subtract(1,"days")
 const end_date=moment()

 const diff = end_date.diff(start_date, "seconds");
 var mind = diff % (60 * 60);

 const hours = Math.floor(diff / (60 * 60));
 const minutes = Math.floor(mind / 60);
 var seconds = Math.ceil(mind % 60);

 console.log("Diff===>", diff, hours, minutes, seconds);

..................Happy Codding...............

0
const totalSeconds = 565;

// ️ get the number of full minutes

const minutes = Math.floor(totalSeconds / 60);

// ️ get the remainder of the seconds

const seconds = totalSeconds % 60;

function padTo2Digits(num) {
  return num.toString().padStart(2, '0');
}

// ✅ format as MM:SS

const result = `${padTo2Digits(minutes)}:${padTo2Digits(seconds)}`;
console.log(result); // ️ "09:25"
-1

You've done enough code to track minutes and seconds portions of time.

What you could do is add the hours factor in:

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
Nimantha
  • 6,405
  • 6
  • 28
  • 69
Nevyn
  • 17
  • 1
  • I tried this using "time" as seconds and it didn't work. For example, 975 sec means hrd = 975, which means hours is 16. – Spedge Sep 11 '13 at 10:28
-1

strftime.js (strftime github) is one of the best time formatting libraries. It's extremely light - 30KB - and effective. Using it you can convert seconds into time easily in one line of code, relying mostly on the native Date class.

When creating a new Date, each optional argument is positional as follows:

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

So if you initialize a new Date with all arguments as zero up to the seconds, you'll get:

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

You can see that 150 seconds is 2-minutes and 30-seconds, as seen in the date created. Then using an strftime format ("%M:%S" for "MM:SS"), it will output your minutes' string.

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

In one line, it would look like:

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

Plus this would allow you to interchangeable support HH:MM:SS and MM:SS based on the number of seconds. For example:

# 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"

And of course, you can simply pass whatever format you want to strftime if you want the time string to be more or less semantic.

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!"
Nimantha
  • 6,405
  • 6
  • 28
  • 69
Sebastian Scholl
  • 855
  • 7
  • 11