Summing Datenum resets after 24 hours
2 ビュー (過去 30 日間)
古いコメントを表示
Hello all,
I am trying to sum datenum values, and return them to hours:mins:secs format when all complete. When the amount of time is relatively small, it works as expected, but once it rolls past 24 hours, it resets.
Example:
a = datenum('21:10:00','hh:MM:ss')
b = datenum('1:10:00','hh:MM:ss')
c = datestr(x+y,'hh:MM:ss')
c = '22:20:00'
x = datenum('21:10:00','hh:MM:ss')
y = datenum('7:10:00','hh:MM:ss')
z = datestr(x+y,'hh:MM:ss')
z = '04:20:00'
Anyone know how to get around that to output :
z = '28:10:00'
and also 3 digit hours if need-be.
Any help is greatly appreciated!
0 件のコメント
採用された回答
Stephen23
2020 年 12 月 15 日
編集済み: Stephen23
2020 年 12 月 15 日
As Steven Lord wrote, serial date numbers are not the right tool for the task: amongst other things you will struggle against defining an appropriate pivot year (which is essential for the task that you are attempting) and as you have already found DATESTR will (by design) return the hours of a day, not an arbitrarily increasing hour count.
But you can easily do it yourself without serial date numbers, here using time in seconds:
v = [60*60,60,1];
a = v * sscanf('21:10:00','%d:%d:%d'); % seconds
b = v * sscanf( '1:10:00','%d:%d:%d'); % seconds
mytime(a+b)
x = v * sscanf('21:10:00','%d:%d:%d'); % seconds
y = v * sscanf( '7:10:00','%d:%d:%d'); % seconds
mytime(x+y)
where:
function str = mytime(tmp)
spl = nan(1,3);
spl(3) = mod(tmp,60); % seconds
tmp = fix(tmp/60);
spl(2) = mod(tmp,60); % minutes
tmp = fix(tmp/60);
spl(1) = tmp ; % hours
str = sprintf('%02d:%02d:%02d',spl);
end
2 件のコメント
Steven Lord
2020 年 12 月 15 日
Instead of using sscanf you could directly call duration as of release R2018a. I know this doesn't help the original poster, but I'm including it as an FYI.
d = duration('21:10:00', 'InputFormat', 'hh:mm:ss')
その他の回答 (2 件)
Matt Gaidica
2020 年 12 月 15 日
I don't know if the datetime functions are going to allow that triple digit hour. Here's one approach.
z = sprintf('%03i:%02i:%02i',hour(x) + hour(y), minute(x+y), second(x+y))
Steven Lord
2020 年 12 月 15 日
Serial date numbers are not the right tool for this job. You want to use a duration array.
dur1 = duration(12, 23, 45)
dur2 = hours(67)+minutes(89)
D = dur1 + dur2
If you want you can control the display Format.
D.Format = 'h'
参考
カテゴリ
Help Center および File Exchange で Dates and Time についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!