Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datum bestimmen von z.B. 3. Sonntag jedes Monats (https://www.delphipraxis.net/7027-datum-bestimmen-von-z-b-3-sonntag-jedes-monats.html)

AndreasZZZ 30. Jul 2003 16:50


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

Duffy 30. Jul 2003 18:44

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:
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;
bye

AndreasZZZ 31. Jul 2003 07:48

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:
Get_next_Wochentag_pro_Monat(5,1,now)
sollte den 31.08.2003 zurückliefern. Es liefert aber den 01.08.2003 zurück.

Kann ich da noch einmal um Hilfe bitten?

Thanks und bye
Andreas

Duffy 31. Jul 2003 08:35

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:
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;
bye

AndreasZZZ 31. Jul 2003 10:26

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:
Get_next_Wochentag_pro_Monat(5,4,now)
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.

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

Duffy 31. Jul 2003 18:06

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:
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;
bye

AndreasZZZ 1. Aug 2003 07:32

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