Einzelnen Beitrag anzeigen

Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#1

Wochentagsbestimmung klassisch und plattformunabhängig

  Alt 7. Mär 2010, 17:55
Am häufigsten wird der Algorithmus von Zeller verwendet.
Dieser ist auch in den meisten Betriebssystemen implementiert.
Die Ergebnisse liefern die sogenannte "voreilende" Zählung
mit Samstag=0, Sonntag = 1 usw.

Von vielen weiteren Kalenderformeln ist der Algorithmus von
Robertson für den gregorianischen Kalender hervorzuheben,
da er sehr einfach ist. Die Ergebnisse liefern die früher
übliche "normale" Zählung mit So=0, Mo=1 usw.
Wer es ISO-konform mag, kann jeweils noch eine Case-Struktur
hinterherschieben.

Die nach Delphi umgesetzten Codeschnippsel:

Delphi-Quellcode:
function wt_zellergreg(d,m,y:integer):integer;
var century,year:integer;
begin
  if (m<3) then
  begin
    m:=m+12;
    y:=y-1;
  end;
  century := y div 100;
  year := y mod 100;
  result:= (d + ((m+1)*26) div 10 + year + year div 4
              + century div 4 + 5*century) mod 7;
  //Samstag:=0;Sonntag=1
end;

function wt_zellerjul(d,m,y:integer):integer;
var century,year:integer;
begin
   if m<3 then
   begin
     m:=m+12;
     y:=y-1;
   end;
   century := y div 100;
   year := y mod 100;
   result:=(d + ((m+1)*13 div 5) + year + year div 4
              + 5 + 6 * century) mod 7;
  //Samstag:=0;Sonntag=1
end;

function WT_Robertson(T,M,J:integer):integer;
var A,B,C,D,E:integer;
Begin
  A:=M+10;
  B:=(M-14) div 12 + J;
  C:=A-12*A div 13;
  D:=(13*C-1) div 5;
  E:=5*(B mod 100) div 4;
  result:=(D+T+77+E+B div 400 - 2*(B div 100)) mod 7;
  //Sonntag =0; Montag=1
end;

procedure TForm1.Button1Click(Sender: TObject);
var dd,mm,yy:integer;
begin
  dd:=StrToInt(Spinedit1.Text);
  mm:=StrToInt(Spinedit2.Text);
  yy:=StrToInt(Spinedit3.Text);
  Edit1.Text:=IntToStr(wt_zellerjul(dd,mm,yy));
end;

procedure TForm1.Button2Click(Sender: TObject);
var d,m,y:integer;
begin
  d:=StrToInt(SpinEdit1.Text);
  m:=StrToInt(SpinEdit2.Text);
  y:=StrToInt(SpinEdit3.Text);
  Edit1.Text:=IntToStr(wt_zellergreg(d,m,y));
end;


procedure TForm1.Button3Click(Sender: TObject);
var d,m,y:integer;
begin
  d:=StrToInt(SpinEdit1.Text);
  m:=StrToInt(SpinEdit2.Text);
  y:=StrToInt(SpinEdit3.Text);
  Edit1.Text:=IntToStr(WT_Robertson(d,m,y));
end;

end.
Wolfgang Mix
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat