You can use annotation objects whose positions are defined in normalized figure space. That requires you to convert the end points from data units to normalized figure units which is done in the demos below. Critically, pay attention to the inline comments because once the conversion is done, you cannot change the position of the axes relative to the figure and you cannot change the axis limits. The offset variable determines the vertical space between the upper axis and the arrows. The arrowEnds variable defines the endpoints of the arrows.
Demo with duration values
ax = axes('Units','Normalize');
time = seconds(0:100:5000);
arrowEnds = [1000, 2000; 2000, 4000];
xlim(ax, [min(time), max(time)])
arrowEndsAxisNorm = arrowEnds./range(xl) + xl(1);
arrowEndFigNorm = arrowEndsAxisNorm.*axPos(3) + axPos(1);
yFigNorm = (sum(axPos([2,4])) + offset);
ah = gobjects(1,size(arrowEndFigNorm,1));
for i = 1:size(arrowEndFigNorm,1)
ah(i) = annotation(fig, 'doublearrow', arrowEndFigNorm(i,:), [yFigNorm,yFigNorm]);
Demo with datetime values
ax = axes('Units','Normalize');
time = datetime(1999,01,01) + days(1:10:500);
arrowEnds = [datetime(1999,04,01), datetime(1999,10,01);
datetime(1999,10,01), datetime(2000,04,01)];
arrowEndsAxisNorm = (arrowEnds-xl(1))/range(xl);
arrowEndFigNorm = arrowEndsAxisNorm.*axPos(3) + axPos(1);
yFigNorm = (sum(axPos([2,4])) + offset);
ah = gobjects(1,size(arrowEndFigNorm,1));
for i = 1:size(arrowEndFigNorm,1)
ah(i) = annotation(fig, 'doublearrow', arrowEndFigNorm(i,:), [yFigNorm,yFigNorm]);