Ich sitze gerade vor einem Problem und ich weiß nicht so recht weiter.
In meinem Programm kann ich einen Task für ausgewählte Wochentage deaktivieren.
Wird der Task am Dienstag gestartet und Dienstag ist in der Liste der ausgewählten Wochentage, dann gehts nicht weiter - alles gewollt bisher.
An einer anderen Stelle im Code gibt es eine kleine Berechnung.
Sagen wir mal es ist der 31.08.2017 gegeben. Der 31.08 ist ein Donnerstag und befindet sich in der Liste.
Das Problem:
wie erhalte ich den nächst-möglichen freien Tag, der nicht in der Liste steht?
Mein aktueller Code sieht so aus. Moben gegebenem Szenario (Datum 31.08.2017) funktioniert er nicht, da die while-Schleife natürlich direkt abbricht:
Delphi-Quellcode:
// aExcludeDays =
// 0, -1, -1, -1, -1, -1, -1 // 0 = False, -1 = True (True = verbotener Wochentag)
// StartTimestamp =
// 31.08.2017 als Unix-Timestamp
// DayOfWeek =
// Der aktuelle Wochentag
// Wandelt das Format in ISO 8601 (Montag erster Tag) um
function GetDayOfWeek(const DateTime: TDateTime): ShortInt;
begin
Result := -1;
case DayOfWeek(DateTime) of
1: // Sunday
Result := 6;
2: // Monday
Result := 0;
3: // Tuesday
Result := 1;
4: // Wednesday
Result := 2;
5: // Thursday
Result := 3;
6: // Friday
Result := 4;
7: // Saturday
Result := 5;
end;
end;
function GetNextAvailableWeekDay(const aExcludeDays: TArray<string>; StartTimestamp, DayOfWeek: Integer): Integer;
var
iTmp: Integer;
begin
if DayOfWeek >= 0 then
begin
iTmp := 0;
while (Length(aExcludeDays) > DayOfWeek) and (StrToBool(aExcludeDays[DayOfWeek])) do
begin
if iTmp = 7 then
begin
StartTimestamp := 0;
Break;
end;
Inc(StartTimestamp, 86400);
DayOfWeek := TDateUtils.GetDayOfWeek(IncSecond(Now, StartTimestamp));
Inc(iTmp);
end;
end;
Result := StartTimestamp;
end;
Ich hoffe mich versteht jemand?
Edit
Ich glaube ich habs. Bin mir aber nicht sicher. GetDayOfWeek() geht sicher auch schöner
Delphi-Quellcode:
while (Length(aExcludeDays) > aDayOfWeek) do // and (StrToBool(aExcludeDays[DayOfWeek])) do
begin
if iTmp = 8 then // 8 statt 7 // Wenn die Woche 1x komplett durch ist, Endlosschleife vermeiden!
begin
StartTimestamp := 0;
Break;
end;
Inc(StartTimestamp, 86400);
aDayOfWeek := TDateUtils.GetDayOfWeek(StartTimestamp); // hier "StartTimestamp" statt "IncSecond(Now, StartTimestamp)"
Inc(iTmp);
if not StrToBool(aExcludeDays[aDayOfWeek - 1]) then // Schlussprüfung
Break;
end
Ok ich habs doch nicht.