########################## # calendar # ########################## # Returns the day of the week in # either Gregorian or Julian, with # Gregorian as the default. # Uses a formula due to Gauss. # #copyleft David Joyner, 2-3-97 ################################################################## ## ##day of the week ## day_of_week:=proc(month::integer,day::integer,year::integer) local w,d,m,c,y,leap; d:=day; m:=month_num(month,day,year); if nargs=4 and args[4]=`J` then c:=cal_num(month,day,year,`J`); else c:=cal_num(month,day,year); fi; y:=year_num(month,day,year); leap:=floor(year/4)*4; if ((month=1 or month=2) and leap=year) then y:=y-1; fi; w:=`mod`(d+m+c+y,7); if w=1 then RETURN(`Sunday`); fi; if w=2 then RETURN(`Monday`); fi; if w=3 then RETURN(`Tuesday`); fi; if w=4 then RETURN(`Wednesday`); fi; if w=5 then RETURN(`Thursday`); fi; if w=6 then RETURN(`Friday`); fi; if w=0 then RETURN(`Saturday`); fi; end: month_num:=proc(month::integer,day::integer,year::integer) if month=1 then RETURN(0); fi; if month=2 then RETURN(3); fi; if month=3 then RETURN(3); fi; if month=4 then RETURN(6); fi; if month=5 then RETURN(1); fi; if month=6 then RETURN(4); fi; if month=7 then RETURN(6); fi; if month=8 then RETURN(2); fi; if month=9 then RETURN(5); fi; if month=10 then RETURN(0); fi; if month=11 then RETURN(3); fi; if month=12 then RETURN(5); fi; end: cal_num:=proc(month::integer,day::integer,year::integer) local y; y:=floor(year/100); if nargs=4 and args[4]=`J` then ###signifies Julian calendar ################### - the default is Gregorian calendar if member(y,{0,7,14}) then print(`Julian calendar`); RETURN(5); fi; if member(y,{1,8,15}) then print(`Julian calendar`); RETURN(4); fi; if member(y,{2,9,16}) then print(`Julian calendar`); RETURN(3); fi; if member(y,{3,10,17}) then print(`Julian calendar`); RETURN(2); fi; if member(y,{4,11,18}) then print(`Julian calendar`); RETURN(1); fi; if member(y,{5,12,19}) then print(`Julian calendar`); RETURN(0); fi; if member(y,{6,13,20}) then print(`Julian calendar`); RETURN(6); fi; fi; ##end if `J` if member(y,{15,19,23}) then print(`Gregorian calendar`); RETURN(1); fi; if member(y,{16,20,24}) then print(`Gregorian calendar`); RETURN(0); fi; if member(y,{17,21,25}) then print(`Gregorian calendar`); RETURN(5); fi; if member(y,{18,22,26}) then print(`Gregorian calendar`); RETURN(3); fi; ERROR(`The Gregorian calendar began in 1582. Use the "J" option for the Julian calendar.`); end: year_num:=proc(month::integer,day::integer,year::integer) local y; y:=year-floor(year/100)*100; if member(y,{0,6,17,23,28,34,45,51,56,62,73,79,84,90}) then RETURN(0); fi; if member(y,{1,7,12,18,29,35,40,46,57,63,68,74,85,91,96}) then RETURN(1); fi; if member(y,{2,13,19,24,30,41,47,52,58,69,75,80,86,97}) then RETURN(2); fi; if member(y,{3,8,14,25,31,36,42,53,59,64,70,81,87,92,98}) then RETURN(3); fi; if member(y,{9,15,20,26,37,43,48,54,65,71,76,82,93,99}) then RETURN(4); fi; if member(y,{4,10,21,27,32,38,49,55,60,66,77,83,88,94}) then RETURN(5); fi; if member(y,{5,11,16,22,33,39,44,50,61,67,72,78,89,95}) then RETURN(6); fi; end: save `calendar.m`;