14

我想将经过的秒数转换为 HH:MM:SS 格式。是否有内置函数,或者我必须自己编写?

4

4 回答 4

17

datestr可能是您正在寻找的功能。将您的时间间隔表示为一天的小数部分,例如:

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

ans =

06:00:00.000    

也就是说,一天的四分之一是 6 小时。如果您想以这种方式转换超过一天的时间间隔,则必须调整第二个参数,该参数会格式化函数的输出,例如:

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

ans =

02:06:09:46.634

的第一个参数datestr也可以是日期向量日期字符串,而不是日期序列号。这应该让您开始,如果您有问题,请提出另一个问题或编辑这个问题。

--
要使用 datestr 以秒为单位转换时间,请将值除以 24*60*60。

样本:

t1 = toc;
timeString = datestr(t1/(24*60*60), 'DD:HH:MM:SS.FFF');
于 2012-08-31T07:43:36.847 回答
7

我不知道内置函数。但是,在 Matlab 的文件交换中有一个SEC2HMS 。基本上,它归结为类似

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

如果您还想对其进行格式化,请使用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
于 2012-08-31T07:49:07.367 回答
5

如果您想将小时、分钟和秒作为双精度数,请考虑以下代码行:

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

hms =

 1    23    20

这行代码比使用内置的 datestr 函数快 100 多倍。

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)

给出 0.001934 毫秒。

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

给出 0.209402 毫秒。

于 2014-01-20T11:55:51.730 回答
4

如果您想要原始的第二个输入,只需将其转换为一天的一小部分:

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

答案=

00-00:00:25

只给它 25 秒(从 tic/toc 开始)

于 2013-03-22T17:42:12.200 回答