function d = dy2date(y) % DY2DATE - Decimal year to serial date number % % Use as: SerialDateNumber = dy2date(DecimalYear) % Inputs: DecimalYear = The date in years % (ex. 1998.345 = % Output: SerialDateNumber = Matlab method of storing dates % % See Also: DATENUM, DATESTR, DATEVEC % Brian Schlining % 22 Dec 1998 % 07 Jan 1998; changed p8 = max(find(p1 > days)) to p8 = max(find(p1 >= days)); This % was done because certain whole numbers (ex. 99) would return empty to p8 YEAR = floor(y); if isleap(YEAR) DaysPerYear = 366; else DaysPerYear = 365; end DAY = (y - YEAR)*DaysPerYear; [rD cD] = size(DAY); for r = 1:rD for c = 1:cD [date y1 mo1 d1] = caldate_(DAY(r,c),YEAR(r,c)); d(r,c) = datenum(y1,mo1,d1+1); % There's a one day offset, correct by adding 1 end end %%%%%%%%% % ISLEAP %%%%%%%%% function p = isleap(year) if rem(year,4) == 0 p = 1; else p = 0; end %%%%%%%%%%% % CALDATE_ %%%%%%%%%%% function [p2,p6,p8,p9,h,mn,s,yy] = caldate_(p1,option) if nargin > 1 if option == 0 Feb = 28; p6 = nan; elseif option == 1 Feb = 29; p6 = nan; else if rem(option,4) == 0 % Then these are leap years p6 = option; % pass year in as option Feb = 29; else p6 = option; Feb = 28; end end daymon = [0 31 Feb 31 30 31 30 31 31 30 31 30 31]; days = cumsum(daymon); p8 = max(find(p1 >= days)); % month p9 = p1 - days(1, p8); % day of month p2 = p9 + p8/100; % DD.MM if p8 > 12 disp('CALDATE_ Error Invalid Julian Day') end h = nan; mn=nan; s=nan; yy = nan; return else [a,b] = size(p1); if(a > 1) p1 = p1'; end p3 = rem(p1 + 0.5,1); % julian days p4 = floor(p1 + 0.5); i1 = find(p4 >= 2299161); if any(i1) p5(i1) = floor((p4(i1) - 1867216.25)./36524.25); p4(i1) = p4(i1) + p5(i1) + ones(size(i1)) - floor(p5(i1)/4); end; p5 = p4 - 1720995; yy = (p5 - 122.1)./365.25; p6 = floor((p5 - 122.1)./365.25); % year p7 = floor(365.25.*p6); p8 = floor((p5-p7)./30.6001); % month p9 = p5 - p7 - floor(30.6.*p8); p10 = floor(p9 + p3); % day of month; 21Jun96 round -> floor i2 = find(p8 >= 14); % must make both tests before changing p8 i3 = find(p8 < 14); if any(i2) p8(i2) = p8(i2) - 1 - 12; end if any(i3) p8(i3) = p8(i3) - 1; end i4 = find(p8 < 3); % if Month is less than 3 add one year if any(i4) p6(i4) = p6(i4) + 1; end; p2 = (p6 - 1900)./10000 + p8./100 + round(p10); % pack into DD.MMYY h = 24*p3; m = (h - floor(h))*60; s = (m - floor(m))*60; h = floor(h); % hour mn = floor(m); % minute s = floor(s); % second if(a > 1) % columns input so make output columns too p1 = p1'; p2 = p2'; p6 = p6'; p8 = p8'; p9 = p9'; h = h'; m = m'; s = s'; mn = mn'; end end