Эта функция сделает свое дело.Вот логика:
- Создание массива datetime для всех дней в данном месяце.
- Получение номеров дней.
- Создание логического массива, true изс первого понедельника (то есть после первых выходных, учитывая, что последний день предыдущего месяца является воскресным).
- Создайте еще один логический массив, используя
isbusday
, чтобы исключить понедельники, которые не являются рабочими днями. - Поиск номера первого дня, в котором эти два логических массива верны, поэтому первый рабочий день после выходных.
Код:
function d = fbusdateAferWE( y, m )
% Inputs: y = year, m = month
% Outputs: day of the month, first business day after weekend
% Create array of days for the given month
dates = datetime( y, m, 1 ):days(1):datetime( y, m, eomday( y, m ) );
% Get the weekday numbers to find first Monday, 1 = Sunday
dayNum = weekday( dates );
% Create the logical array to determine days from first Monday
afterFirstWeekend = ( cumsum(dayNum==2) > 0 ).';
% Get first day which is afterFirstWeekend and a business day.
d = find( afterFirstWeekend & isbusday( dates ), 1 );
end
Возможно, вы могли быускорить это (хотя это будет довольно быстро), не глядя на целый месяц, а скажем, всего 2 недели.Я использовал eomday
, чтобы получить последний день месяца, что означает, что мне не нужно делать предположения о небольшом количестве праздничных дней в первую неделю или что-то в этом роде.
Редактировать: Работа с datenum
ускоряет его вдвое (C / O JohnAndrews):
function d = fbusdateAferWE( y, m )
% Inputs: y = year, m = month
% Outputs: day of the month, first business day after weekend
% Create array of days for (first 2 weeks of) the given month
dates = datenum(datetime(y,m,1)):datenum(datetime(y,m,eomday(y,m)))-14;
% Get the weekday numbers to find first Monday, 1 = Sunday
dayNum = weekday( dates );
% Create the logical array to determine days from first Monday
afterFirstWeekend = ( cumsum(dayNum==2) > 0 ).';
% Get first day which is afterFirstWeekend and a business day.
d = find( afterFirstWeekend & isbusday( dates ), 1 );
end