MATLAB: Generating array of consecutive timestamps in double

datenumdatestrnum2strparforstr2double

I need to generate an array of consecutive timestamps, in double and yyyymmddHHMMSS format, for specified start and end times. For example:
timestamps(1) = 2.012082104000000e+013;
timestamps(2) = 2.012082104000100e+013;
...
...
timestamps(120) = 2.012082104020000e+013;
I wrote a working piece of code, but the str2double/datestr combination in the parfor loop is too slow (I used 120 seconds as an example, but in actual use, I will be generating about 10^7 consecutive seconds of timestamps). Is there a faster way to do this?
if matlabpool('size') == 0
matlabpool local
end
startDate = num2str(2.012082104000000e+013);
endDate = num2str(2.012082104020000e+013);
startDateyyyy = str2double(startDate(:,1:4));
startDatemm = str2double(startDate(:,5:6));
startDatedd = str2double(startDate(:,7:8));
startDateHH = str2double(startDate(:,9:10));
startDateMM = str2double(startDate(:,11:12));
startDateSS = str2double(startDate(:,13:14));
startDateVec = [startDateyyyy startDatemm startDatedd startDateHH ...
startDateMM startDateSS];
startDate = datenum(startDateVec);
endDateyyyy = str2double(endDate(:,1:4));
endDatemm = str2double(endDate(:,5:6));
endDatedd = str2double(endDate(:,7:8));
endDateHH = str2double(endDate(:,9:10));
endDateMM = str2double(endDate(:,11:12));
endDateSS = str2double(endDate(:,13:14));
endDateVec = [endDateyyyy endDatemm endDatedd endDateHH ...
endDateMM endDateSS];
endDate = datenum(endDateVec);
timestamps = startDate:(1/24*1/60*1/60):endDate;
parfor i = 1:length(timestamps)
timestamps(i) = str2double(...
datestr(timestamps(i),'yyyymmddHHMMSS'));
end
Thanks in advance!

Best Answer

I recommend to use MATLAB serial dates as produced by datenum(). Any manipulation with dates becomes much easier. The appearance can be controlled with datestr().
% Generate serial dates increasing by one second from 2012-08-21 04:00:00
dates = datenum(2012,08,21,4,0,0:120)
% Visualize them in format 31 yyyy-mm-dd HH:MM:SS
datestr(dates,31)
Alternatively:
st = 20120821040000;
en = 20120821040200;
sten = [st; en];
y = floor(sten/1e10);
m = floor(rem(sten, 1e10)/1e8);
d = floor(rem(sten, 1e8)/1e6);
HH = floor(rem(sten, 1e6)/1e4);
MM = floor(rem(sten, 1e4)/1e2);
SS = rem(sten, 1e2);
% Again MATLAB serial dates
stenser = datenum(y,m,d,HH,MM,SS);
dates2 = stenser(1):1/(60^2*24):stenser(2);
% Controlling appearance
datestr(dates2,31);
% Now you have to reverse into yyyymmddHHMMSS
dtvc = datevec(dates2);
out = dtvc(:,1)*1e10 + dtvc(:,2)*1e8 + dtvc(:,3)*1e6 +...
dtvc(:,4)*1e4 + dtvc(:,5)*1e2 + dtvc(:,6);