116 lines
2.6 KiB
Matlab
116 lines
2.6 KiB
Matlab
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 |