Earthquake/day_array.m

116 lines
2.6 KiB
Matlab
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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