![]() |
Wochentagsbestimmung klassisch und plattformunabhängig
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:
Wolfgang Mix
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. |
Re: Wochentagsbestimmung klassisch und plattformunabhängig
Mal ganz ehrlich, wozu braucht man so etwas in der Codelib? Delphi liefert doch mindestens eine der Varianten bereits mit. Ich persönlich habe das Gefühl das du ab und an die Delphihilfe aufschlägst, dir per Zufall eine Funktion heraus suchst, diese nachprogrammierst und dann hier in die Codelib stellen willst.
Ich dachte in die Codelib sollen Sachen die nicht bereits mit Delphi ausgeliefert werden. |
Re: Wochentagsbestimmung klassisch und plattformunabhängig
Anders herum!
Schau dir mal bitte genauer an, wie umständlich Borland/Embarcadero das gelöst haben. Ich wette zusätzlich, dass die Klassiker schneller sind. Die DateUtils von z.B D7 machen das umständlicher
Delphi-Quellcode:
Verfolgt das mal weiter
function DayOfTheWeek(const AValue: TDateTime): Word;
begin Result := (DateTimeToTimeStamp(AValue).Date - 1) mod 7 + 1; end; Viel Spass Gruß Wolfgang |
Re: Wochentagsbestimmung klassisch und plattformunabhängig
Zitat:
Ausserdem finde ich es gut, wenn in der Codelib die Delphi-Umsetzung von mehr oder weniger bekannten Algorithmen zu finden sind. Vor ein paar Wochen mußte ich den Zeller nachbauen, da wär es schön gewesen wenn ich da etwas in der Codelib gefunden hätte. Gruß K-H |
Re: Wochentagsbestimmung klassisch und plattformunabhängig
Zitat:
|
Re: Wochentagsbestimmung klassisch und plattformunabhängig
Zitat:
Gruß K-H edit:
Delphi-Quellcode:
function Wochentag(dt:tdatetime):integer; { Zellers Kongruenz}
var jahr, monat, tag : word; jahrh : word; d1, d2, d3, d4 : integer; begin decodedate(dt,jahr,monat,tag); case monat of 1,2 : begin monat:=monat+12; jahr:=jahr-1; end; end; jahrh:=(jahr div 100)*100; d1:=(((monat+1)*26) div 10); d2:=(jahr mod 100)+((jahr mod 100) div 4); d3:=((jahrh div 4)-(2*jahrh)); d4:=d1+d2+d3+tag ; if d4<0 then result:=(d4 mod 7)+7 else result:=d4 mod 7; end; |
Re: Wochentagsbestimmung klassisch und plattformunabhängig
Ich würde mich nicht entmutigen lassen!
Sobald du hier einen suboptimalen Code im Forum vostellst, stürzen sich die Exoerten darauf und wollen helfen zu optimieren. Das ist normal und ist mir hier schon öfter passiert. Ich habe vieles daraus gelernt. Ich code erst 1 Jahr in Delphi und nehme fast jeden Verbesserungsvorschlag an, um voran zu kommen. Selbst Luckie (30.000 Beiträge) ] hat letzte Woche hier einen Beitrag gepostet und gezeigt, dass man unter Zeitdruck eigentlich nur schlechten Code erzeugen kann. Blamieren kann man sich hier eigentlich nicht, es sei denn, man ist geouteter Lehrer :) Gruß Wolfgang |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 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