|
REM converts Day of Week, Week number + Year to a Julian Day Number. DEFFN_wmjd(DD%,W%,Y%) LOCAL O%(),M%,E% DIM O%(12) D%=W%*7+DD%-(FN_dow2(FN_mjd(4,1,Y%))+3) IF FN_leap(Y%) THEN O%()=0,31,60,91,121,152,182,213,244,274,305,335,366 ELSE O%()=0,31,59,90,120,151,181,212,243,273,304,334,365 J%=0:M%=0 FOR A%=1 TO 12:IF O%(A%)>=D% AND M%=0 THEN D%-=O%(A%-1):M%=A% NEXT A% IF M%=0 THEN M%=1:Y%+=1 IF FN_leap(Y%-1) D%-=366 ELSE D%-=365 ENDIF = FN_mjd(D%,M%,Y%) REM converts Julian Day to Week number ( and Year ) DEFFN_week(J%, RETURN Y%) LOCAL W% Y%=FN_year(J%) W%=INT((FN_doj(J%)-FN_dow2(J%)+10)/7) IF W%<1 THEN Y%-=1:W%=FN_longyear(Y%) ELSE IF W%>FN_longyear(Y%) THEN Y%+=1:W%=1 =W% REM Find the day-of-week (1-7, 1 = Monday) from the MJD DEF FN_dow2(J%) =((J%+2400001) MOD 7)+1 REM Find the day-of-year DEF FN_doj(J%) LOCAL O%(),D%,M%,Y% DIM O%(12):D%=FN_day(J%):M%=FN_month(J%):Y%=FN_year(J%) IF FN_leap(Y%) THEN O%()=0,31,60,91,121,152,182,213,244,274,305,335,366 ELSE O%()=0,31,59,90,120,151,181,212,243,273,304,334,365 =O%(M%-1)+D% REM Is Y% a leap year or not? DEF FN_leap(Y%) = (Y% MOD 4 = 0) AND ((Y% MOD 400 = 0) OR (Y% MOD 100 <> 0)) REM Has Y% 53 weeks or 52 weeks? DEF FN_longyear(Y%) LOCAL S%,E% S%=FN_dow2(FN_mjd(1,1,Y%)) E%=FN_dow2(FN_mjd(31,12,Y%)) IF FN_leap(Y%)=FALSE AND S%=4 THEN =53 IF FN_leap(Y%)=TRUE AND S%=3 THEN =53 IF FN_leap(Y%)=FALSE AND E%=4 THEN =53 IF FN_leap(Y%)=TRUE AND E%=5 THEN =53 IF S%=4 AND E%=4 THEN =53 =52