home *** CD-ROM | disk | FTP | other *** search
- {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.): ' );
- ReadLn( Year );
- 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): ' );
- ReadLn( Month );
- 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}