2012-06-04

Wann im Jahr ist Ostersonntag? (When is easter sunday?)

- Wann ist Ostersonntag?

- Warum?

- Damit ich Feiertage bestimmen kann.

- Wo brauchst Du es?

- In meiner Excel-Datei... Zeitnachweise und so...


... hat mich ein Kollege kürzlich gefragt. Ich sagte ihm, er finde die Lösung zu seinem Problem unter "Gaußsche Osterformel" bei de.Wikipedia.org

Da ihn die Ausführungen dort mehr oder weniger verwirrten, gab ich ihm einfach die für den gregorianischen Kalender passende Excel-Formel. Dabei ist A2 die Referenz auf die Zelle, in welcher die Jahreszahl des zu berechnenden Ostersonntag-Termins steht:
= DATUM(A2;3;(21 + (REST( 19*(REST(A2;19)) + (15 + GANZZAHL( (3*(GANZZAHL(A2/100))+3) / 4 ) - GANZZAHL( (8*(GANZZAHL(A2/100))+13) / 25)); 30)) - (GANZZAHL(GANZZAHL( ((REST( 19*(REST(A2;19)) + (15 + GANZZAHL( (3*(GANZZAHL(A2/100))+3) / 4 ) - GANZZAHL( (8*(GANZZAHL(A2/100))+13) / 25)); 30)) + (REST(A2;19))) /11 ) / 29)))+(7 - REST((21 + (REST( 19*(REST(A2;19)) + (15 + GANZZAHL( (3*(GANZZAHL(A2/100))+3) / 4 ) - GANZZAHL( (8*(GANZZAHL(A2/100))+13) / 25)); 30)) - (GANZZAHL(GANZZAHL( ((REST( 19*(REST(A2;19)) + (15 + GANZZAHL( (3*(GANZZAHL(A2/100))+3) / 4 ) - GANZZAHL( (8*(GANZZAHL(A2/100))+13) / 25)); 30)) + (REST(A2;19))) /11 ) / 29))) - (7 - REST( A2 + GANZZAHL(A2 / 4) + (2 - GANZZAHL( (3*(GANZZAHL(A2/100))+3) / 4)); 7 )); 7)))

(english)
A short while ago a friend asked me how to calculate "easter sunday" based on a given "gregorian" year. He would need a formula for his excel file. So I gave him the following formula with A2 referring to the cell that contains an integer determining the year for which the easter sunday is to be calculated:
= DATE(A2;3;(21 + (MOD( 19*(MOD(A2;19)) + (15 + INT( (3*(INT(A2/100))+3) / 4 ) - INT( (8*(INT(A2/100))+13) / 25)); 30)) - (INT(INT( ((MOD( 19*(MOD(A2;19)) + (15 + INT( (3*(INT(A2/100))+3) / 4 ) - INT( (8*(INT(A2/100))+13) / 25)); 30)) + (MOD(A2;19))) /11 ) / 29)))+(7 - MOD((21 + (MOD( 19*(MOD(A2;19)) + (15 + INT( (3*(INT(A2/100))+3) / 4 ) - INT( (8*(INT(A2/100))+13) / 25)); 30)) - (INT(INT( ((MOD( 19*(MOD(A2;19)) + (15 + INT( (3*(INT(A2/100))+3) / 4 ) - INT( (8*(INT(A2/100))+13) / 25)); 30)) + (MOD(A2;19))) /11 ) / 29))) - (7 - MOD( A2 + INT(A2 / 4) + (2 - INT( (3*(INT(A2/100))+3) / 4)); 7 )); 7)))

1 comment:

  1. AddOn C#-Variant:

    int year = 2012;

    int month = 3;

    int day = (21+((19*(year%19)+(15+((3*((year/100))+3)/4)-((8*((year/100))+13)/25)))%30)
    -((((((19*(year%19)+(15+((3*((year/100))+3)/4)-((8*((year/100))+13)/25)))%30)+(year%19))/11)/29)))
    +(7-((21+((19*(year%19)+(15+((3*((year/100))+3)/4)-((8*((year/100))+13)/25)))%30)
    -((((((19*(year%19)+(15+((3*((year/100))+3)/4)-((8*((year/100))+13)/25)))%30)
    +(year%19))/11)/29)))-(7-(year+(year/4)+(2-((3*((year/100))+3)/4)))%7))%7);

    DateTime eastersunday = new DateTime(year, month, 1).AddDays(day - 1);

    ReplyDelete