![]() |
Datum bestimmen von z.B. 3. Sonntag jedes Monats
Hallo,
ich bin echt am verzweifeln, denn ich suche nun schon seit gestern alles Mögliche und Unmögliche zum Thema Datum-Berechnung in Delphi aber bei meinem Problem bin ich kein bisschen weiter. Ich muss das Datum berechnen des nächsten x. Wochentages eines Monats, d.h. vom aktuellen Tag ausgehen und bestimmen wann ist z.B. der nächste 3. Sonntag eines Monats. Z.B. nehmen wir mal an: heute ist Mittwoch, der 16.07.2003 - gesuchter Tag: der nächste 3. Sonntag eines Monats, d.h. 20.07.2003 oder - gesuchter Tag: der nächste 2. Sonntag eines Monats, d.h. 10.08.2003 Es soll eine Funktion sein, die etwa wie folgt aussehen function Get_next_Wochentag_pro_Monat(iWelcher, iWochentag: Integer): TDateTime; mit iWelcher=1 bis 5, d.h. x. Wochentag mit iWochentag=1 bis 7 analog DayOfWeek, d.h. Sonntag=1 und Samstag=7 Somit würde um bei obigem Beispiel zu bleiben: - Get_next_Wochentag_pro_Monat(3,1) den 20.07.2003 - Get_next_Wochentag_pro_Monat(2,1) den 10.08.2003 zurückliefern, wenn heute der 16.07.2003 wäre. Ich bin echt am verzweifeln. Hat jemand eine Idee? Bye Andreas |
Re: Datum bestimmen von z.B. 3. Sonntag jedes Monats
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo AndreasZZZ,
ich nehme an, daß es sich hier um eine Hausaufgabe handelt. Aber da Dir noch keiner einen Lösungsansatz geboten hat, habe ich mal auf die Schnelle deine Funktion realisiert. Zumindest bringt sie die gewünschten Ergebnisse. Vielleicht weiß noch jemand einen anderen Lösungsansatz. Mir fiel jedenfalls im Moment auch nichts Besseres ein, als durch den Monat zu iterieren und die Anzahl der gesuchten Wochentage zu zählen.
Delphi-Quellcode:
bye
function Get_next_Wochentag_pro_Monat(iWelcher, iWochentag: Integer; BaseDate: TDateTime): TDateTime;
var I: Integer; Day, Month, Year: Word; Times: Integer; begin Times := 0; DecodeDate(BaseDate, Year, Month, Day); if Day > (iWelcher * 7) then begin if Month < 12 then begin Inc(Month, 1); end else begin Month := 1; Inc(Year, 1); end; end; Result := EncodeDate(Year, Month, 1) + Frac(BaseDate); for I := 1 to 31 do begin if DayOfWeek(Result) = iWochentag then begin Inc(Times, 1); if Times = iWelcher then begin Break; end end; Result := Result + 1; end; end; |
Re: Datum bestimmen von z.B. 3. Sonntag jedes Monats
Hallo,
danke für Deine Hilfe. So einen ähnlichen Ansatz hatte ich auch schon, bin aber nicht ganz so weit gekommen. Allerdings funktioniert die Funktion noch nicht so 100%ig. Der August hat 5 Sonntage, d.h. ein Aufruf von
Delphi-Quellcode:
sollte den 31.08.2003 zurückliefern. Es liefert aber den 01.08.2003 zurück.
Get_next_Wochentag_pro_Monat(5,1,now)
Kann ich da noch einmal um Hilfe bitten? Thanks und bye Andreas |
Re: Datum bestimmen von z.B. 3. Sonntag jedes Monats
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo AndreasZZZ,
jetzt geht es, ich glaube aber Du solltest aber auch Einsatz zeigen.
Delphi-Quellcode:
bye
function Get_next_Wochentag_pro_Monat(iWelcher, iWochentag: Integer; BaseDate: TDateTime): TDateTime;
var I: Integer; Day, Month, Year: Word; Times: Integer; begin if not(iWelcher in [1..5]) then begin ShowMessage('Blödsinnige Eingabe. Bitte wiederholen'); Exit; end; Times := 0; DecodeDate(BaseDate, Year, Month, Day); if Day > (iWelcher * 7) then begin if Month < 12 then begin Inc(Month, 1); end else begin Month := 1; Inc(Year, 1); end; end; Result := EncodeDate(Year, Month, 1) + Frac(BaseDate); for I := 1 to 31 do begin if DayOfWeek(Result) = iWochentag then begin Inc(Times, 1); if Times = iWelcher then begin Break; end end; Result := Result + 1; end; if Times < iWelcher then begin Result := Get_next_Wochentag_pro_Monat(iWelcher, iWochentag, Result); end; end; |
Re: Datum bestimmen von z.B. 3. Sonntag jedes Monats
Hallo,
danke noch einmal und ich zeige auch selbst Einsatz aber wenn ich ganz ehrlich bin, habe ich bei diesen ganzen Datumsberechnungen ziemlich Probleme, sonst hätte ich auch hier nicht um Hilfe gefragt. Die Funktion hat immer noch ein kleines Problem und so leid es mir auch tut, ich habe keine Ahnung was ich tun soll um das Problem zu beheben. Wenn ich die Funktion starte mit
Delphi-Quellcode:
d.h. ich will den nächsten 5. Mittwoch des Monats wissen. Im August gibt es keinen 5. Mittwoch. Der nächste 5. Mittwoch ist der 29.10.2003.
Get_next_Wochentag_pro_Monat(5,4,now)
Die Funktion liefert aber den 30.07.2003 zurück. Sorry wenn ich wieder um Hilfe frage aber ich habe da echt Probleme. Bye Andreas |
Re: Datum bestimmen von z.B. 3. Sonntag jedes Monats
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo AndreasZZZ,
so, jetzt der letzte Versuch ...
Delphi-Quellcode:
bye
function Get_next_Wochentag_pro_Monat(iWelcher, iWochentag: Integer; BaseDate: TDateTime): TDateTime;
var I: Integer; BaseDay, BaseMonth, BaseYear: Word; Day, Month, Year: Word; Times: Integer; begin Result := 0; DecodeDate(BaseDate, BaseYear, BaseMonth, BaseDay); if not(iWelcher in [1..5]) then begin ShowMessage('Blödsinnige Eingabe. Bitte wiederholen'); Exit; end; Times := 0; DecodeDate(BaseDate, Year, Month, Day); if Day > (iWelcher * 7) then begin if Month < 12 then begin Inc(Month, 1); end else begin Month := 1; Inc(Year, 1); end; end; Result := EncodeDate(Year, Month, 1) + Frac(BaseDate); for I := 1 to 31 do begin if DayOfWeek(Result) = iWochentag then begin Inc(Times, 1); if Times = iWelcher then begin Break; end end; Result := Result + 1; end; DecodeDate(Result, Year, Month, Day); if (Times < iWelcher) or (Baseday > Day) or (BaseMonth <> Month) then begin BaseDay := 1; if BaseMonth < 12 then begin Inc(BaseMonth, 1); end else begin BaseMonth := 1; Inc(BaseYear, 1); end; BaseDate := EncodeDate(BaseYear, BaseMonth, 1) + Frac(BaseDate); Result := Get_next_Wochentag_pro_Monat(iWelcher, iWochentag, BaseDate); end; end; |
Re: Datum bestimmen von z.B. 3. Sonntag jedes Monats
Hallo,
danke für Deine Hilfe. Die Funktion scheint nun wirklich alle möglichen Fälle abzudecken. Ohne Dich wäre ich wahrscheinlich nie auf die Lösung gekommen. Bye Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 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