Нормальноя обработка переходов дат между месяцами/годами
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