From a3d8f29b00304fcf352b135f22749be63407f331 Mon Sep 17 00:00:00 2001 From: L_DelOff <51275636+LDelOff@users.noreply.github.com> Date: Sat, 12 Jun 2021 23:30:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=8F=D1=86=D0=B0=D0=BC=D0=B8/=D0=B3=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day_array.m | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 day_array.m diff --git a/day_array.m b/day_array.m new file mode 100644 index 0000000..aada264 --- /dev/null +++ b/day_array.m @@ -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 \ No newline at end of file