OpenVMS Source Code Demos
WCSM_CALC_EASTER_N_GOOD_FRIDAY.FUN
!========================================================================
! 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
Home
Neil Rieck
Waterloo, Ontario, Canada.