Thema: Delphi Arbeitstage berechnen

Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#20

Re: Arbeitstage berechnen

  Alt 23. Mai 2009, 13:45
Ergänzung Ostersonntag:

Zitat Wikipedia:

Zitat:
Obwohl die Gaußsche Osterformel den Oster-Algorithmus elegant kurz darstellt, werden zwei Ausnahmen von ihr nicht erfasst. Heiner Lichtenberg hat 1997 eine Modifikation der Formel vorgeschlagen, mit der keine Ausnahmen extra beachtet werden müssen. Diese Formel ist nachfolgend wiedergegeben
http://de.wikipedia.org/wiki/Gaußsche_Osterformel

1. die Säkularzahl: K(X) = X div 100
2. die säkulare Mondschaltung: M(K) = 15 + (3K + 3) div 4 − (8K + 13) div 25
3. die säkulare Sonnenschaltung: S(K) = 2 − (3K + 3) div 4
4. den Mondparameter: A(X) = X mod 19
5. den Keim für den ersten Vollmond im Frühling: D(A,M) = (19A + M) mod 30
6. die kalendarische Korrekturgröße: R(D,A) = D div 29 + (D div 28 − D div 29) (A div 11)
7. die Ostergrenze: OG(D,R) = 21 + D − R
8. den ersten Sonntag im März: SZ(X,S) = 7 − (X + X div 4 + S) mod 7
9. die Entfernung des Ostersonntags von der
Ostergrenze (Osterentfernung in Tagen): OE(OG,SZ) = 7 − (OG − SZ) mod 7
10. das Datum des Ostersonntags als Märzdatum
(32. März = 1. April usw.): OS = OG + OE


hier habe ich folgenden Code nach dieser Formel gefunden:


http://cerebrumsoft.org/node/54

Delphi-Quellcode:
(* Hucke
  Berechnung des Ostersonntag
  Algorithmus nach Gauß
  modifiziert von Lichtenberg
  aus: Wikipedia "Gaußsche Osterformel" 26.02.2008
*)

 
uses
    sysutils;
 
function EasterSunday_Lichtenberg(const Jahr :integer): TDateTime;
var
    k, // Säkularzahl säkular = weltlich im Gegensatz zu kirchlich
    m, // säkulare Mondschaltung
    s, // säkulare Sonnenschaltung
    a, // Mondparameter
    d, // erster Vollmond im Frühling
    r, // kalendarische Korrekturgröße
    og, // Ostergrenze
    sz, // erster Sonntag im März
    oe, // Differenz Ostersonntag Ostergrenze (Osterentfernung)
    os, // Ostersonntag als Märzdatum
    tag,
    monat : integer;
 
begin
    k := Jahr div 100;
    m := 15 + (3 * k + 3) div 4 - (8 * k + 13) div 25;
    s := 2 - (3*k + 3 ) div 4;
    a := Jahr mod 19;
    d := (19 * a + m ) mod 30;
    r := d div 29 + (d div 28 - d div 29) * (a div 11);
    og := 21 + d - r;
    sz := 7 - (Jahr + Jahr div 4 + s ) mod 7;
    oe := 7 - (og - sz) mod 7;
    os := og + oe;
 
    if os <= 31 then begin
       Tag := os;
       Monat := 3;
    end
    else begin
       Tag := os - 31;
       Monat := 4;
    end;
 
    result := encodedate(jahr, Monat, Tag);
 
end;
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat