Thema: Delphi Wochentagsberechnung

Einzelnen Beitrag anzeigen

Balu der Bär
(Gast)

n/a Beiträge
 
#1

Wochentagsberechnung

  Alt 1. Okt 2006, 18:42
Nochmal ein Versuch eines Algorithmuses, schnell frei "übersetzt" nach Delphi aus der Wikipedia.

Ist sicherlich noch verbesserungswürdig, Vorschläge können gern gemacht werden.

Delphi-Quellcode:
(*

Wochentagsberechnung

Frei nach Wikipedia ([url]http://de.wikipedia.org/wiki/Wochentagsberechnung[/url])

Gibt den Wochentag zu einem Datum zurück.

Diese Funktion gibt eine Ganzzahl 0 bis 6 zurück, 0 steht dabei fuer Sonntag,
1 fuer Montag und so weiter. Die Jahreszahl des Datums muss zwischen 800
und 3100 liegen!

Datum: 02.10.2006
Autor: Balu der Baer

*)
 

function GetDaybyDate(day, month, year : Word) : Integer;
var
step1, step2, step3, step4, step5 : Integer;
yearnumbers, centurynumbers, i : Integer;
begin
 yearnumbers := year mod 100;
 centurynumbers := year div 100;
 if not ((centurynumbers >= 8) and (centurynumbers <= 31)) then
 begin
  raise Exception.CreateFmt('function GetDaybyDate: parameter Year must be between 800 and 3100 but is %d', [Year]);
 end else
 begin
  step1 := day mod 7;
  case month of
   1, 10: step2 := 0;
   2, 3, 11: step2 := 3;
   4, 7: step2 := 6;
   5: step2 := 1;
   6: step2 := 4;
   8: step2 := 2;
   9, 12: step2 := 5;
  end;
  step3 := (yearnumbers div 12) + (yearnumbers mod 12) + ((yearnumbers mod 12) div 4);
  case centurynumbers of
   11,15,19,23,27,31 : step4 := 0;
   10,14,18,22,26,30 : step4 := 2;
   9,13,17,21,25,29 : step4 := 4;
   8,12,16,20,24,28 : step4 := 6;
  end;
  if (IsLeapYear(year) and (month = 1)) or (IsLeapYear(year) and (month = 2)) then step5 := 6 else step5 := 0;
  i := (step1 + step2 + step3 + step4 + step5) mod 7;
  result := i;
  end;
end;
Möglicher Aufruf:
Delphi-Quellcode:
var
 days : array [0..6] of String = ('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag');

...

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(days[GetDaybyDate(StrToInt(edit1.Text), StrToInt(edit2.Text), StrToInt(edit3.Text))]);
end;
So, jetzt könnt ihr mich zerfleischen, obwohl ich hoffe das das so in Ordnung ist.
  Mit Zitat antworten Zitat