![]() |
Wochentagsberechnung
Nochmal ein Versuch eines Algorithmuses, schnell frei "übersetzt" nach Delphi aus der
![]() Ist sicherlich noch verbesserungswürdig, Vorschläge können gern gemacht werden.
Delphi-Quellcode:
Möglicher Aufruf:
(*
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;
Delphi-Quellcode:
So, jetzt könnt ihr mich zerfleischen, obwohl ich hoffe das das so in Ordnung ist. ;)
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; |
Re: Wochentagsberechnung
das ist aber suboptimal, weil man sollte noch auswählen können ob die Woche am Sonntag oder Montag beginnt :mrgreen:
|
Re: Wochentagsberechnung
Nach dem gregorianischen Kalender beginnt die Woche imho Sonntag. ;)
|
Re: Wochentagsberechnung
Zitat:
Zitat:
![]() Ich wüsste nicht dass der gregorianische Kalender da was festlegt :gruebel: |
Re: Wochentagsberechnung
Naja Meflin, meine Funktion hält sich an die Standards die auch Delphi benutzt. Zum Beispiel die Funktion DayOfWeek arbeitet auch mit diesem Prinzip. Auszug OH:
Zitat:
|
Re: Wochentagsberechnung
hast du mal das analysiert ?
Delphi-Quellcode:
function DayOfWeek(Date: TDateTime): Integer;
begin Result := Trunc(Date) mod 7 +1; end; Zitat:
Gruß Hagen [edit] mein Posting könnte sich eventuell ein bischen arrogant anhören, sorry dafür, ist natürlich nicht so gemeint. Ein Schmunzeln kann ich mir aber denoch nicht vermeiden, denn wie man sieht kann man mit TDateTime viel effiezienter rechnen als man es vielleicht vermuten würde. Der Trick ist ganz einfach: TDateTime im Vorkommapart enthält die Anzahl der Tage seit einem fixen Startdatum. Ein TDateTime = 0 ist demzufolge gleich diesem STartdatum. Das Startdatum wurde so gewählt das es ein 1.1. eines Jahres ist und dieser Tag zusätzlich nich ein Sonntag war. Ergo: den Wochentag eines TDateTime zu berechen oder die Differenz zweier TDateTime in Tagen zu berechnen sind ganz normale mathematiche Operationen, simple Formeln die mit divisionen/subtraktionen auskommen. [/edit] |
Re: Wochentagsberechnung
Zitat:
|
Re: Wochentagsberechnung
nein ist es eben nicht.
1.) bei häufigen Aufrufen, zb. in Calendarcontrols, spielt die Performance eine große Rolle 2.) die Frage der Gültigkeit deiner Funktion ist entscheidend, denn deine kann nur in einem Bruchteil (Jahr muß 1200 bis 2700 sein), angewendet werden. DayOfWeek() der RTL arbeitet mit jedem Datum was per TDateTime möglich sein kann -> Jahr = -2^47 bis +2^47. Das ist eine rießige Menge mehr. 3.) dein Source sagt einem erfahrenen Programmierer das du garnicht weist wie TDateTime funktioniert. Denn wenn du es wüsstest würdest du eingestehen das dein Source "von hinten in den Kopf und dann durch die Brust" programmiert ist. Schau mal, dein Posting soll in eine CodeLib, das heist das ich annehmen muß das du der Meinung bist, das andere Programmierer deine Funktion nutzen sollen, als Ersatz für eine optimale DayOfWeek() Funktion der RTL ?? Wenn du diesen Thread in der Delphi Sparte gepostet hättest, zb. mit dem Titel "eine andere Möglichkeit den Wochentag zu berechnen" dann hätte ich es noch verstehen können. Baue deine Funktion so um das du als Parameter keinen TDateTime erwartest sondern das Jahr,Monat und Tag als Integer. Denn exakt dann, also wenn man in seinem Code eben keinen TDateTime hat sondern nur diese 3 Werte, macht deine Funktion einen Sinn. Zb. als Referenz für Mikrocontroller oder andere Systeme die kein TDateTime kennen. Auf solchen Plattformen wird nämlich meistens mit Jahr,Monat,Tag gerechnet. Aber für einen Anwender der Delphi RTL ist deine Wochentagfunktion schlichtweg sinnlos. Ich weis das meine Worte eine harte Kritik sind, aber besser die Tatsachen auf den Tisch gelegt als drumherum geredet. Gruß Hagen |
Re: Wochentagsberechnung
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
den Code entsprechend um weitere Jahrhunderte erweitert, es würde trotzdem nie an TDateTime herankommen, wie du schon richtig erwähnt hast.
case centurynumbers of
15,19,23,27 : step4 := 0; 14,18,22,26 : step4 := 2; 13,17,21,25 : step4 := 4; 12,16,20,24 : step4 := 6; end; Zitat:
Edit: Neue Version siehe oben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:14 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