diff --git a/day_array.m b/day_array.m new file mode 100644 index 0000000..aada264 --- /dev/null +++ b/day_array.m @@ -0,0 +1,116 @@ +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 \ No newline at end of file