# Moonphase

How to calculate Moon phases

Contributor: ALAN GRAFF

{
As Robert Forbes said to All on 25 Apr 94...

RF> Anyone have any idea how to make an algorithm to
RF> calculate the moonphase given the date?

Here ya go:

TYPE DATETYPE = record
day:WORD;
MONTH:WORD;
YEAR:WORD;
dow:word;
end;

{=================================================================}

Procedure GregorianToJulianDN(Year, Month, Day:Integer;
var JulianDN :LongInt);
var
Century,
XYear : LongInt;

begin {GregorianToJulianDN}
If Month <= 2 then begin
Year := pred(Year);
Month := Month + 12;
end;
Month := Month - 3;
Century := Year div 100;
XYear := Year mod 100;
Century := (Century * D1) shr 2;
XYear := (XYear * D0) shr 2;
JulianDN := ((((Month * 153) + 2) div 5) + Day) + D2

+ XYear + Century;
end; {GregorianToJulianDN}

{=================================================================}

Function MoonPhase(Date:Datetype):Real;

(***************************************************************)
(* *)
(* Determines APPROXIMATE phase of the moon (percentage lit) *)
(* 0.00 = New moon, 1.00 = Full moon *)
(* Due to rounding, full values may possibly never be reached *)
(* Valid from Oct. 15, 1582 to Feb. 28, 4000 *)
(* Calculations and BASIC program found in *)
(* "119 Practical Programs For The TRS-80 Pocket Computer" by *)
(* John Clark Craig, TAB Books, 1982 *)
(* Conversion to Turbo Pascal by Alan Graff, Wheelersburg, OH *)
(* *)
(***************************************************************)

var
j:longint; m:real;

Begin
GregorianToJulianDN(Date.Year,Date.Month,Date.Day,J);
M:=(J+4.867)/ 29.53058;
M:=2*(M-Int(m))-1;
MoonPhase:=Abs(M);
end;