Einzelnen Beitrag anzeigen

Glados
(Gast)

n/a Beiträge
 
#1

Kompliziertes Problem mit Wochentagberechnung

  Alt 28. Aug 2017, 18:36
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.

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