Нормальноя обработка переходов дат между месяцами/годами

master
L_DelOff 2021-06-12 23:30:35 +03:00
parent 21ba1b046e
commit a3d8f29b00
1 changed files with 116 additions and 0 deletions

116
day_array.m Normal file
View File

@ -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