!======================================================================== ! Title : wcsm_calc_easter_n_good_friday_106.fun ! Author : Neil Rieck ! Created: 1996.06.06 ! Purpose: Calculate the date of EASTER SUNDAY and GOOD FRIDAY !======================================================================== ! parameter 1: stamp$ = ccyymmddHHMMSS ! stamp$ = blank, then use today's year ! parameter 2: sw% = 0 (return Easter Sunday) ! sw% = 1 (return Good Friday) !======================================================================== function string wcsm_calc_easter_n_good_friday(string stamp$, long sw%) ! option type=explicit ! no kid stuff ! external string function wcsm_dt_stamp() ! ! declare string year$ , ! & long year , ! & A , ! & B , ! & C , ! & D , ! & E , ! & F , ! & G , ! & H , ! & I , ! & K , ! & L , ! & M , ! & P , ! & Q , ! & my_Month , ! & my_Day ! !======================================================================== ! main !======================================================================== if len(stamp$) = 0 then ! if no date was specified then... year$ = left$(wcsm_dt_stamp, 4) ! use today's year else ! else year$ = left$(stamp$, 4) ! use year of passed parameter end if ! ! ! <<< calculate the date of Easter for the year provided >>> ! when error in ! year = integer( year$ ) ! convert string to a number use ! if not numeric year = -1 ! force an error end when ! ! ! this algorithm has legal limits so test them now ! select year ! case <= 1582 ! Gregorian Calendar Reform (1582) wcsm_calc_easter_n_good_friday = "" ! return nothing goto fini ! end select ! !----------------------------------------------------------------------------- ! Easter is the Sunday after the Paschal Full Moon !----------------------------------------------------------------------------- ! ! Algorithm by Jean Baptiste Joseph Delambre ! ------------------------------------------ ! A = Mod(Year / 19) ! B = Int(Year / 100) ! C = Mod(Year / 100) ! D = Int(B / 4) ! E = Mod(B / 4) ! F = Int[(B + 8) / 25] ! G = Int[(B - F + 1) / 3] ! H = Mod[(19xA + B - D - G + 15) / 30] ! I = Int(C / 4) ! K = Mod(C / 4) ! L = Mod[(32 + 2xE + 2xI - H - K) / 7] ! M = Int[(A + 11xH + 22xL) / 451] ! P = Int[(H + L - 7xM + 114) / 31] ! Q = Mod[(H + L - 7xM + 114) / 31] ! ! note: some algorithms mess up years like: 1974, 1984, 1994, etc. ! ! sample run: ! ---------------- ! 19900415 correct ! 19910331 correct ! 19920419 correct ! 19930411 correct ! 19940403 correct ! 19950416 correct !----------------------------------------------------------------------------- A = Mod(Year , 19) ! golden number B = Int(Year / 100) ! C = Mod(Year , 100) ! D = Int(B / 4) ! E = Mod(B , 4) ! F = Int((B + 8) / 25) ! G = Int((B - F + 1) / 3) ! H = Mod((19 * A + B - D - G + 15) , 30) ! I = Int(C / 4) ! K = Mod(C , 4) ! L = Mod((32 + 2 * E + 2 * I - H - K) , 7) ! M = Int((A + 11 * H + 22 * L) / 451) ! P = Int((H + L - 7 * M + 114) / 31) ! month# (starts at 1) Q = Mod((H + L - 7 * M + 114) , 31) ! day# (starts at zero) ! my_month = P ! my_day = Q + 1 ! ! if sw% = 0 then ! Easter Sunday wcsm_calc_easter_n_good_friday = year$ + format$(my_Month,"<0>#") + format$(my_Day,"<0>#") else ! Good Friday gosub move_back_one_day ! gosub move_back_one_day ! wcsm_calc_easter_n_good_friday = year$ + format$(my_Month,"<0>#") + format$(my_Day,"<0>#") end if ! goto fini ! ! ! <<< move back one day >>> ! ! note: since we only call this twice, ! and the lower bound will always be the Spring Equinox (March 21), ! don't worry about falling back into February ! move_back_one_day: ! my_Day = my_Day - 1 ! go back one day if my_Day = 0 then ! oops, can't have day zero my_Month = 3 ! set month to 3 (March) my_Day = 31 ! March only has 31 days end if ! return ! ! ! <<< that's all folks >>> ! fini: ! end function !
Back to OpenVMS
Back to OpenVMS Demo Index
Back to Home
Neil Rieck
Kitchener - Waterloo - Cambridge, Ontario, Canada.