Einzelnen Beitrag anzeigen

Glados
(Gast)

n/a Beiträge
 
#3

AW: Kompliziertes Problem mit Wochentagberechnung

  Alt 28. Aug 2017, 21:28
Also diese Antwort hat mir jetzt leider nicht geholfen
Zitat:
GetDayOfWeek .... Delphi-Referenz durchsuchenDayOfWeek oder Delphi-Referenz durchsuchenDayOfTheWeek
Jetzt hab ichs kapiert. Aber oben schrieb ich:
Zitat:
// Wandelt das Format in ISO 8601 (Montag erster Tag) um
Deswegen habe ich ja meine eigene Funktion - damit bei mir die Woche mit Montag beginnt.

Zitat:
Und wenn die While-Schleife zu früh abbricht, dann stimmt deine Bedingung wohl nicht.
Oder wenn die Schleife immer mindestens einmal durchlaufen soll, dann es womöglich mal mit einer Repeat-Schleife versuchen.
Passt nicht in mein Szenario.

Ich habs jetzt gelöst. Schön ist aber anders
Delphi-Quellcode:
// aExcludeDays =
// 0, -1, -1, -1, -1, -1, -1 // 0 = False, -1 = True (True = verbotener Wochentag)

// StartTimestamp =
// 31.08.2017 als Unix-Timestamp

// Beim Aufruf von dieser Funktion mit übergebenem Start-Datum 31.08.2017 (Donnerstag) und obigem Array,
// muss das Resultat der 04.09.2017 (Montag) sein, da er kein "verbotener" Tag ist.

procedure GetNextAvailableWeekDay(const aExcludeDays: TArray<string>; StartTimestamp: Integer): Integer;
var
 iTmp, aDayOfWeek: Integer;
 bDayExcluded: Boolean;
begin
 iTmp := 0;

 // Prüfe, ob das Startdatum (hier 31.08.2017) ein "verbotener" Tag ist.
 aDayOfWeek := TDateUtils.GetDayOfWeek(UnixToDateTime(StartTimestamp));
 bDayExcluded := StrToBool(aExcludeDays[aDayOfWeek]);

 // Wenn der Tag "verboten" wurde (mit -1 oben im Array), dann springe hier rein
 if bDayExcluded then
  begin
   while True do
    begin
     Inc(StartTimestamp, 86400); // Füge dem Startdatum einen Tag hinzu
     aDayOfWeek := TDateUtils.GetDayOfWeek(UnixToDateTime(StartTimestamp)); // Hole den Wochentag (Woche beginnt mit Montag)

     // Prüfe erneut, ob das Datum ein "verbotener" Tag ist
     bDayExcluded := StrToBool(aExcludeDays[aDayOfWeek]);

     // Ist das Datum ein erlaubter/freier Tag, dann können wir hier abbrechen und es als Ergebnis verwenden
     if not bDayExcluded then
      Break;

     Inc(iTmp);
     if iTmp = 8 then
      begin
       StartTimestamp := 0;
       Break;
      end;
    end;
  end;

 Result := StartTimestamp;
end;

Geändert von Glados (28. Aug 2017 um 22:20 Uhr)
  Mit Zitat antworten Zitat