``````{DF> I need an accurate method of converting back and Forth between
> Gregorian and Julian dates.

if you mean the True Julian day, as used in astronomy ...
}

Program JulianDate;                 { Gregorian date to Julian day  }

Uses    Crt;                        { Turbo/Quick Pascal            }
Var     Month, Year, greg       : Integer;
Day, JulianDay          : Real;
LeapYear, DateOkay      : Boolean;
begin
ClrScr;
WriteLn( 'Julian Dates v0.1 Dec.20.91 G.Vigneault' );
WriteLn( '[Enter Gregorian calendar values]');
WriteLn;
{ A.D. years entered normally, B.C. years as negative }
Write( 'Enter Year (nnnn For A.D., -nnnn For B.C.): ' );
LeapYear := False;      { assume not }
if ((Year MOD 4)=0)     { possible LeapYear? }
then if ((Year MOD 100)<>0)  { LeapYear if not century }
or ((Year MOD 100)=0) and ((Year MOD 400)=0)
then LeapYear := True;
Repeat
Write( 'Enter Month (1..12): ' );
Until ( Month < 13 ) and ( Month > 0 );

WriteLn('Julian Days begin at Greenwich mean noon (12:00 UT)');
DateOkay := False;
Repeat
Write( 'Enter Day (1.0 <= Day < 32.0): ' );
ReadLn( Day );          {may be decimal to include hours}
if ( Day >= 1.0 ) and ( Day < 32.0 )
then Case Month of
1,3,5,7,8,10,12 : if Day < 32.0 then DateOkay := True;
4,6,9,11        : if Day < 31.0 then DateOkay := True;
2               : if ( Day < 29.0 ) or
( Day < 30.0 ) and LeapYear
then DateOkay := True
else  WriteLn('not a leapyear!');
end; {Case}
if not DateOkay then Write( #7 );       { beep }
Until DateOkay;

(* here is where we start calculation of the Julian Date *)

if Month in [ 1, 2 ]
then    begin
DEC( Year );
inC( Month, 12 )
end;

{ account For Pope Gregory's calendar correction, when }
{ the day after Oct.4.1582 was Oct.15.1582 }

if ( Year < 1582 ) or
( Year = 1582 ) and ( Month < 10 ) or
( Year = 1582 ) and ( Month = 10 ) and ( Day <= 15 )
then    greg := 0       { Oct.15.1582 or earlier }
else    begin           { Oct.16.1582 or later }
greg := TRUNC( Year div 100 );
greg := 2 - greg + TRUNC( greg div 4 );
end;

if ( Year >= 0 )         { circa A.D. or B.C. ? }
then  JulianDay := inT( 365.25 * Year )         {AD}
else  JulianDay := inT( 365.25 * Year - 0.75 ); {BC}

JulianDay := JulianDay
+ inT( 30.6001 * ( Month + 1 ) )
+ Day
+ 1720994.5
+ greg;

WriteLn;
WriteLn( 'Equivalent Julian date is : ', JulianDay:8:2 );
WriteLn;
end. {JulianDate}

``````