Нормальноя обработка переходов дат между месяцами/годами
parent
21ba1b046e
commit
a3d8f29b00
|
@ -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
|
Loading…
Reference in New Issue