AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Kompliziertes Problem mit Wochentagberechnung
Thema durchsuchen
Ansicht
Themen-Optionen

Kompliziertes Problem mit Wochentagberechnung

Ein Thema von Glados · begonnen am 28. Aug 2017 · letzter Beitrag vom 29. Aug 2017
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 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