Files
ifctools/IFC.m

53 lines
1.6 KiB
Matlab

function fixed = IFC(gregorian)
arguments (Input)
gregorian (:,1) datetime
end
arguments (Output)
fixed (:, 4) table
end
% gregorian datetime 1 arg input?
% y/m/d 3 args input?
% TODO inputs validation
% prepare output struct
fixed = struct('Year', [], 'Month', '', 'Day', [], 'DayOfWeek', '');
fixed = repmat(fixed, length(gregorian), 1);
% eliminate time from input, only date matters
gregorian.Hour = 0; gregorian.Minute = 0; gregorian.Second = 0;
% year remains constant
Year = num2cell(uint16(year(gregorian')));
[fixed.Year] = Year{:};
% find number of days into the current year
Days = days(gregorian - datetime([fixed.Year] - 1, 12, 31)');
% Calculate IFC month, number of days into that month, and if leap day
% and/or year day occured
[nMonths, nDays, leaped, yeared] = IFCmonths(Days, [fixed.Year]');
% write month to output
Month = num2cell(MONTHS(nMonths));
[fixed.Month] = Month{:};
% write number of days in month to output
nDays = num2cell(nDays);
[fixed.Day] = nDays{:};
% write day of week to output
DOW = num2cell(DAYSOFWEEK(mod([fixed.Day]', 7)));
[fixed.DayOfWeek] = DOW{:};
% Write year days as special days of the week
yearDays = num2cell(repmat(DAYSOFWEEK(7), 1, sum(yeared)));
[fixed(yeared).DayOfWeek] = yearDays{:}; % try 2 year/leap days in a vector input
% Write leap days as special days of the week
leapDayFlags = ~yeared & leaped & [fixed.Month]' == MONTHS(14) & [fixed.Day]' == 0;
leapDays = num2cell(repmat(DAYSOFWEEK(8), 1, sum(leapDayFlags)));
[fixed(leapDayFlags).DayOfWeek] = leapDays{:};
% convert output to table
fixed = struct2table(fixed);
end