[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]

    {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}

[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]