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;