Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Ostersonntag eines Jahres berechnen (https://www.delphipraxis.net/38409-ostersonntag-eines-jahres-berechnen.html)

flomei 18. Jan 2005 23:05


Ostersonntag eines Jahres berechnen
 
Mit folgendem Code kann man das Datum des Ostersonntags in einem beliebigen Jahr berechnen.
Code stammt von mir aus diesem Programm.

Delphi-Quellcode:
{
  Diese Formel berechnet das Datum des Ostersonntags im Jahr "year".
  Ostersonntag liegt immer zwischen dem 22. März und dem 25. April.
  Diese Formel stammt vom Mathematiker Carl Friedrich Gauß (1777-1855).

  Autor:   Florian Meier
  Webseite: [url]http://www.flomei.de[/url]

  Gruß und Dank an alle Mitglieder der Delphi-PRAXIS ([url]www.delphipraxis.net[/url])
}
 
function EasterSunday(year: Integer) : String;
var
  a, b, c, d, e: Integer;
begin
  a := year mod 19;
  b := year mod 4;
  c := year mod 7;
  d := ((a * 19) + 24) mod 30;
  e := (2 * b + 4 * c + 6 * d + 5) mod 7;

  if((22 + d + e) > 31) then
  begin
    Result := IntToStr((d + e - 9)) + '. April';
  end else
  begin
    Result := IntToStr((22 + d + e)) + '. März';
  end
end;
HTH!

MfG Florian :hi:

[edit]
Folgende Ergänzung traf von Billa per PN ein:
Zitat:

Gauss hat m.W.n. den Algorithmus eingegrenzt:

1. Er gilt nur von 1700 bis 2199

2. es gibt zwei Ausnahmen:

a) Anstelle des 26. Aprils ist immer der 19. April zu setzen,
b) Anstelle des 25. Aprils immer dann der 18. April, wenn d=28 und a>10.
[/edit]

[edit=Matze]Code formatiert. Mfg, Matze[/edit]

CalganX 1. Apr 2007 20:23

Re: Ostersonntag eines Jahres berechnen
 
Von [user]Balu der Bär[/user] kommt noch folgende Alternative, die sich auf die Gaußsche Osterformel stützt (gilt nur von 1583 bis zum Jahr 3900):

Delphi-Quellcode:
(* Gaußsche Osterformel (Berechnung des Ostersonntages)

  nach Carl Friedrich Gauß

  Der 22. März is der früheste Termin, der 25. April der letzte, auf den Ostern fallen kann.
  Gilt für die Jahre 1583 (Beginn des Gregorianischen Kalenders) bis 3900.

  Umsetzung: Balu der Baer
*)

function EasterSunday(Year : Integer) : TDateTime;
var
  a, b, c, d, e,
  H1, H2, n, m,
  temp, easter : Integer;
begin
  if not ((Year > 1583) and (Year < 3900)) then
    raise Exception.CreateFmt('function EasterSunday: parameter Year must be between 1583 and 3900 but is %d', [Year])
  else begin
    a := Year mod 19;
    b := Year mod 4;
    c := Year mod 7;
    H1 := Year div 100;
    H2 := Year div 400;
    n := 4 + H1 - H2;
    m := 15 + H1 - H2 - ((8 * H1 + 13) div 25);
    d := (19 * a + m) mod 30;
    e := (2 * b + 4 * c + 6 * d + n) mod 7;

    if d + e = 35 then
      easter := 50;
    if (d = 28) and (e = 6) and (a > 10) then
      easter := 49
    else
      easter := 22 + d + e;

    if easter > 31 then
    begin
      temp := easter - 31;
      case temp of
        26 : temp := 19;
        25 : if (d = 28) and (a > 10) then temp := 18;
      end;
      result := EncodeDate(Year, 4, temp);
    end
    else
      result := EncodeDate(Year, 3, easter);
  end
end;

//Beispielaufruf:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(DateTimeToStr(EasterSunday(StrToInt(Edit1.Text))));
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz