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

    {
    >
    > Has anyone an algorithm to determine moveable feasts - such as Easter -
    > which is calculated by the year? by any other method?

    Popular question this past 2 days. Here is our kcEaster function from our KingCalendar product. Just pass it the year and it will
    return a TDateTime for Easter. Enjoy the code, it was a fun to write<G>

    function kcEaster( nYear: Integer ): TDateTime;
    var
       nMonth, nDay, nMoon, nEpact, nSunday, nGold, nCent, nCorx, nCorz: Integer;
     begin

        { The Golden Number of the year in the 19 year Metonic Cycle }
        nGold := ( ( nYear mod 19 ) + 1  );

        { Calculate the Century }
        nCent := ( ( nYear div 100 ) + 1 );

        { No. of Years in which leap year was dropped in order to keep in step
          with the sun }
        nCorx := ( ( 3 * nCent ) div 4 - 12 );

        { Special Correction to Syncronize Easter with the moon's orbit }
        nCorz := ( ( 8 * nCent + 5 ) div 25 - 5 );

        { Find Sunday }
        nSunday := ( ( 5 * nYear ) div 4 - nCorx - 10 );

        { Set Epact (specifies occurance of full moon }
        nEpact := ( ( 11 * nGold + 20 + nCorz - nCorx ) mod 30 );

        if ( nEpact < 0 ) then
           nEpact := nEpact + 30;

        if ( ( nEpact = 25 ) and ( nGold > 11 ) ) or ( nEpact = 24 ) then
           nEpact := nEpact + 1;

        { Find Full Moon }
        nMoon := 44 - nEpact;

        if ( nMoon < 21 ) then
           nMoon := nMoon + 30;

        { Advance to Sunday }
        nMoon := ( nMoon + 7 - ( ( nSunday + nMoon ) mod 7 ) );

        if ( nMoon > 31 ) then
           begin
             nMonth := 4;
             nDay   := ( nMoon - 31 );
           end
        else
           begin
             nMonth := 3;
             nDay   := nMoon;
           end;

        Result := EncodeDate( nYear, nMonth, nDay );

     end;

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