[Java] Gauß'scher Osteralgorithmus

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Fuselmeister, 27. Oktober 2011 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 27. Oktober 2011
    Gauß'scher Osteralgorithmus

    Hi
    ich will mir die beweglichen Feiertage berechnen lassen. Dazu hab ich den Gauß'schen Osteralgorithmus gefunden. Der bestimmt Ostersonntag, von dem ja alle Tage abhängig sind. Den Tag schreibe ich in ein Calendar Java Objekt. Die restlichen Tage berechne ich durch Subtrahieren bzw. Addieren der entsprechenden Anzahl der Millisekunden.
    So habe ich das jetzt implementiert:
    Code:
     public void calcEasterDate() {
     Ostern.set(Calendar.YEAR, cYear);
     Ostern.set(Calendar.HOUR_OF_DAY, 12);
     Ostern.set(Calendar.MINUTE, 0);
     Ostern.set(Calendar.SECOND, 0);
     Ostern.set(Calendar.MILLISECOND, 0);
     
     if ((cYear < 1900) && (cYear > 2599)) {
     Ostern.set(Calendar.YEAR, 0);
     } else {
     
     int M = 0;
     int N = 0;
     if ((cYear >= 1900) && (cYear <= 2099)) {
     M = 24;
     N = 5;
     } else if ((cYear >= 2100) && (cYear <= 2199)) {
     M = 24;
     N = 6;
     } else if ((cYear >= 2200) && (cYear <= 2299)) {
     M = 25;
     N = 7;
     } else if ((cYear >= 2300) && (cYear <= 2399)) {
     M = 25;
     N = 8;
     } else if ((cYear >= 2400) && (cYear <= 2499)) {
     M = 26;
     N = 9;
     } else if ((cYear >= 2500) && (cYear <= 2599)) {
     M = 26;
     N = 10;
     }
     
     int a = cYear % 19;
     int b = cYear % 4;
     int c = cYear % 7;
     int d = (19*a + M) % 30;
     int e = (2*b + 4*c + 6*d + N) % 7;
     
     if ((22 + d + e) <= 31) {
     Ostern.set(Calendar.DAY_OF_MONTH, 22 + d + e);
     Ostern.set(Calendar.MONTH, Calendar.MARCH);
     } else {
     Ostern.set(Calendar.DAY_OF_MONTH, d + e - 9);
     Ostern.set(Calendar.MONTH, Calendar.APRIL);
     }
     
     FT_KARFREITAG = Ostern.getTimeInMillis() - 1000 * 60 * 60 * 24 * 2;
     FT_OSTERMONTAG = Ostern.getTimeInMillis() + 1000 * 60 * 60 * 24 * 1;
     FT_CHR_HIMMEL = Ostern.getTimeInMillis() + 1000 * 60 * 60 * 24 * 39;
     FT_PFINGSTSONNTAG = Ostern.getTimeInMillis() + 1000 * 60 * 60 * 24 * 49;
     FT_PFINGSTMONTAG = Ostern.getTimeInMillis() + 1000 * 60 * 60 * 24 * 50;
     FT_FRONLEICHNAM = Ostern.getTimeInMillis() + 1000 * 60 * 60 * 24 * 60;
     
     }
     }
    
    Die Tage für dieses Jahr stimmen, aber im nächsten Jahr ist alle drunter und drüber. Allerdings zeigt der auch nur die Tage für dieses Jahr bis Christi Himmelfahrt an und danach kommt nix mehr.
    Hat da jemand rätsels Lösung?

    mfg
    Fuselmeister
     
  2. 31. Oktober 2011
    AW: Gauß'scher Osteralgorithmus

    Könntest mal die Ganze Klasse irgendwie zeigen?
     
  3. 31. Oktober 2011
    AW: Gauß'scher Osteralgorithmus

    in die falle bin ich auch schon getappt. ;-)

    das problem ist, dass du das Objekt des jetzigen Calenders modifiziert. siehe hier:

    Code:
     if ((22 + d + e) <= 31) {
     Ostern.set(Calendar.DAY_OF_MONTH, 22 + d + e);
     Ostern.set(Calendar.MONTH, Calendar.MARCH);
     } else {
     Ostern.set(Calendar.DAY_OF_MONTH, d + e - 9);
     Ostern.set(Calendar.MONTH, Calendar.APRIL);
     }
    
    
    auf dieser grundlage berechnest du sich die weiteren tage. somit bekommst du nur müll heraus.

    abhilfe schafft nur ein clone des Ostern-objekts
     
  4. 6. November 2011
    AW: Gauß'scher Osteralgorithmus

    jo daran lags, habs jetzt so geändert:
    Code:
    int a = cYear % 19;
    int b = cYear % 4;
    int c = cYear % 7;
    double k = cYear / 100;
    double p = (8*k + 13) / 25;
    double q = k / 4;
     
    double M = (15 + k - p - q) % 30;
    double N = (4 + k - q) % 7;
     
    double d = (19 * a + M) % 30;
    double e = (2 * b + 4 * c + 6 * d + N) % 7;
    int eMon = 3;
    int eDay = (int) Math.round(22 + d + e);
     
    if (eDay > 31) {
     eDay = eDay - 32;
     eMon = 4;
    }
     
    Ostern.set(Calendar.MONTH, eMon-1);
    Ostern.set(Calendar.DAY_OF_MONTH, eDay);
    FT_OSTERSONNTAG = Ostern.getTimeInMillis();
    
    Die Weiteren Feiertage berechne ich dann einfach durch Addieren der Tag (in Millisekunden) mit FT_OSTERSONNTAG. läuft super
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.