使用'HH:MM:SS'格式(MATLAB)计算从日期开始的经过时间(以秒为单位)

时间:2017-06-23 12:29:01

标签: matlab matlab-figure matlab-deployment matlab-compiler

我正在尝试将字符串中的日期转换为时间向量,其格式为:'HH:MM:SS',在一个以秒为单位的时间向量中。它可以很好地工作直到某一点并在它返回之后假值。

以下是我正在做的事情:

a={'596:30:18';'596:30:28';'596:30:38';'596:30:48';'596:30:58';'596:31:08';'596:31:18';'596:31:28';'596:31:38';'596:31:48';'596:31:58';'596:32:08';'596:32:18';'596:32:28';'596:32:38';'596:32:48';'596:32:58';'596:33:08'};

         formatIn = 'HH:MM:SS';
         DateVector = datevec(a(1:end,:),formatIn);
         time = etime(DateVector,DateVector(1,:));    

它返回:

DateVector =

2017    1   25  20  30  18
2017    1   25  20  30  28
2017    1   25  20  30  38
2017    1   25  20  30  48
2017    1   25  20  30  58
2017    1   25  20  31  8
2017    1   25  20  31  18
2016    12  7   3   28  40,7040000000000
2016    12  7   3   28  50,7040000000000
2016    12  7   3   29  0,704000000000000
2016    12  7   3   29  10,7040000000000
2016    12  7   3   29  20,7040000000000
2016    12  7   3   29  30,7040000000000
2016    12  7   3   29  40,7040000000000
2016    12  7   3   29  50,7040000000000
2016    12  7   3   30  0,704000000000000
2016    12  7   3   30  10,7040000000000
2016    12  7   3   30  20,7040000000000

time =

0
10
20
30
40
50
60
-4294897,29600000
-4294887,29600000
-4294877,29600000
-4294867,29600000
-4294857,29600000
-4294847,29600000
-4294837,29600000
-4294827,29600000
-4294817,29600000
-4294807,29600000
-4294797,29600000

只有7个firt值是正确的。有人知道为什么会这样吗?

3 个答案:

答案 0 :(得分:2)

这是另一种没有循环和方式更快的方法(理论上):

E =  bsxfun(@minus,D,D(1,:));
F = E(:,1)*3600 + E(:,2)*60 + E(:,3)

>>F =

 0
10
20
30
40
50
60
70
80
90
100
110
120
130
140
150
160
170

这将您的时间戳转换为小时:分钟:3列中的秒数,您可以很容易地减去并获得时间:

src

btw,这是多么奇怪的日期时间格式。

答案 1 :(得分:1)

我能想到的唯一解释是HH标识符不能用于3位数小时。实际上,datevec的datevec documentation

  

HH - 两位数格式的小时

因此,'596:30:28'可能不是有效的日期字符串,您需要将其转换为其他格式,例如'dd:HH:MM:SS'

这可以这样做(假设所有小时都是3位数字):

a={'596:30:18';'596:30:28';'596:30:38';'596:30:48';'596:30:58';'596:31:08';'596:31:18';'596:31:28';'596:31:38';'596:31:48';'596:31:58';'596:32:08';'596:32:18';'596:32:28';'596:32:38';'596:32:48';'596:32:58';'596:33:08'};

a_ddhhmmss = {};
for ii=1:length(a)
    datestring = a{ii};
    colon_indices = strfind(datestring, ':');  %check how many digits the hours have
    hours_digits = colon_indices(1)-1;
    hours = str2num(datestring(1:hours_digits));
    days = floor(hours/24) + 1; % start with day=1
    hours = rem(hours,24);
    a_ddhhmmss{end+1} = [num2str(days), ':', num2str(hours), datestring(4:end)];
end

formatIn = 'dd:HH:MM:SS';
DateVector = datevec(a_ddhhmmss(1:end,:),formatIn)
time = etime(DateVector,DateVector(1,:))

当然,您观察到的行为只会在日期'596:30:18''596:30:28'之间设置,这仍然没有任何意义。即使datevec函数在范围之外使用,也应该抛出错误而不是返回无意义的输出。

答案 2 :(得分:1)

首先使用datenumdatetime转换a,减去第一个时间点,然后转换为seconds,即可轻松完成此操作:

D = datetime(datenum(a), 'ConvertFrom', 'datenum');  % A datetime array
secElapsed = seconds(D-D(1))

secElapsed =

     0
    10
    20
    30
    40
    50
    60
    70
    80
    90
   100
   110
   120
   130
   140
   150
   160
   170