简体   繁体   中英

Is there a Matlab function to convert elapsed seconds to HH:MM:SS format?

I would like to convert an elapsed number of seconds into HH:MM:SS format. Is there a built-in function for this, or do I have to write my own?

datestr is probably the function you are looking for. Express your time interval as a decimal fraction of a day, for example:

>> datestr(0.25, 'HH:MM:SS.FFF')

ans =

06:00:00.000    

That is, one quarter of a day is 6 hours. If you want to transform intervals longer than a day this way you'll have to adjust the second argument, which formats the function's output, for example:

>> datestr(2.256789741, 'DD:HH:MM:SS.FFF')

ans =

02:06:09:46.634

The first argument to datestr could also be either a date vector or a date string rather than a date serial number. This should get you started, if you have problems ask another question or edit this one.

--
To convert a time in seconds using datestr, divide the value by 24*60*60.

Sample:

t1 = toc;
timeString = datestr(t1/(24*60*60), 'DD:HH:MM:SS.FFF');

I don't know a built-in function. However, there is a SEC2HMS on Matlab's File Exchange. Basically, it boils down to something like

function [hours, mins, secs] = sec2hms(t)
    hours = floor(t / 3600);
    t = t - hours * 3600;
    mins = floor(t / 60);
    secs = t - mins * 60;
end

If you also want to have it formatted, use a printf :

function hms = sec2hms(t)
    hours = floor(t / 3600);
    t = t - hours * 3600;
    mins = floor(t / 60);
    secs = t - mins * 60;
    hms = sprintf('%02d:%02d:%05.2f\n', hours, mins, secs);
end

sec2hms(69.9904)
ans =
    00:01:09.99

If you want to get the hours, minutes and seconds as doubles consider the following line of code:

seconds = 5000;
hms = fix(mod(seconds, [0, 3600, 60]) ./ [3600, 60, 1])

hms =

 1    23    20

This line of code is more than 100 times faster than using the built-in datestr funciton.

nIterations = 10000;

tic
for i = 1:nIterations
    hms = fix(mod(seconds, [0, 3600, 60])./[3600, 60, 1]);
end
sprintf('%f ms\r', toc / nIterations * 1000)

gives 0.001934 ms.

tic
for i = 1:nIterations
    datestr(seconds/24/3600, 'HH:MM:SS');
end
sprintf('%f ms\r', toc / nIterations * 1000)

gives 0.209402 ms.

If you want from original second input, just convert it to a fraction of the day:

datestr(25/24/3600, 'DD-HH:MM:SS')

ans =

00-00:00:25

Just gives it for 25 seconds (as from tic/toc)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM