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.