function dates=day_array(dd,mm,yyyy,prev,next) %% By L_DelOff % функция формирует массив, состоящий из дат, по которым тербуется провести % анализ % Вход: день x, месяц x, год x, скольно тербуется дней до, скольно тербуется дней % после дня x % Выход: структура % номер день месяц год % 1 dd mm yyyy % 2 dd mm yyyy % ... %% Для отладки (потом закомментировать) % dd=15; % mm=12; % yyyy=2019; % prev=400; % next=400; %% Начало dates=[]; count=0; for i=-prev:next count=count+1; dates(count).N=count; dates(count).N2=i; [d, m, y]=offset_date(dd,mm,yyyy,i); dates(count).day=d; dates(count).month=m; dates(count).year=y; end end function [d, m, y]=offset_date(dd,mm,yyyy,N) %% By L_DelOff % учет перехода через месяц при переходе с dd.mm.yyyy на N дней % 1. январь 31 % 2. февраль 28(29) % 3. март 31 % 4. апрель 30 % 5. май 31 % 6. июнь 30 % 7. июль 31 % 8. август 31 % 9. сентябрь 30 % 10. октябрь 31 % 11. ноябрь 30 % 12. декабрь 31 %% Начало d=dd+N; m=mm; y=yyyy; while d<=0 % на месяц назад m=m-1; % отнимаем месяц while m<=0 y=y-1; m=m+12; end if sum(m==[1 3 5 7 8 10 12])==1 % если предыдущий месяц имеет 31 день d=d+31; else if (m==2) d=d+28; if mod(y,4)==0 d=d+1; end else d=d+30; end end end % определить конец текущего месяца if sum(m==[1 3 5 7 8 10 12])==1 endday=31; else if (m==2) endday=28; if mod(y,4)==0 endday=29; end else endday=30; end end while d>endday if sum(m==[1 3 5 7 8 10 12])==1 d=d-31; else if (m==2) d=d-28; if mod(y,4)==0 d=d-1; end else d=d-30; end end m=m+1; % прибавляем месяц while m>12 y=y+1; m=m-12; end if sum(m==[1 3 5 7 8 10 12])==1 endday=31; else if (m==2) endday=28; if mod(y,4)==0 endday=29; end else endday=30; end end end end