Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Prüfen ob Datum ein Feiertag oder SA/SO ist...
whitef - Sa 09.01.16 23:54
Titel: Prüfen ob Datum ein Feiertag oder SA/SO ist...
Hallo,
es liegt ein Datum vor (bsp. heute). zu diesem tag werden
+ N (bsp. 14 Tage) Tage berechnet.
Nun möchte ich prüfen ob
Datum + N ein Feiertag, ein SA oder ein SO ist. Falls dies der Fall ist, dann verwende
Datum + N + 1 (bzw. Datum + N + i) und prüfe dies erneut ob Feiertag/SA/SO.
Ich habe bereits die aktuellen Feiertage in einem Array. Und die Prüfung auf SA/SO habe ich mit "FormatSettings.ShortDayNames[DayOfWeek( ... )" umgesetzt;
nur fehlt mir momentan die integrierung von beidem...
Wie würdet ihr dies lösen?
Folgendes besteht bereits:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| procedure TFormDates.FormShow(Sender: TObject); var Feiertage : TFeiertageTable; i, FristDauer: Integer; DatumHeute, DatumFrist: TDate; DatumFristShortDay: String; begin
Feiertage := GetFeiertageTable(CurrentYear);
FristDauer := 14; DatumHeute := Date(); DatumFrist := IncDay(DatumHeute, FristDauer); DatumFristShortDay := FormatSettings.ShortDayNames[DayOfWeek( DatumFrist )];
for i := Low(Feiertage) to High(Feiertage) do begin if DatumFrist = Feiertage[i].Date then begin FristDauer := FristDauer + 1; DatumFrist := IncDay(DatumHeute, FristDauer); DatumFristShortDay := FormatSettings.ShortDayNames[DayOfWeek( DatumFrist )]; end; end; end; |
Holgerx - So 10.01.16 11:59
Hmm..
Wieso erst den Wochentag zu einem string machen? Vor allem, da der Wochentag Sprachspezifisch ist?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| uses DateUtils;
procedure TForm1.Button1Click(Sender: TObject); begin if DayOfTheWeek(now) in [6,7] then ShowMessage('Wochentag ist Sa/So!'); end; |
Bei DayOfTheWeek ist 6 der Samstag und 7 der Sonntag.
Lagere deine Prüfroutine für den Feiertag in eine eigene Funktion aus, da Du nach jeder Incrementierung des Datums (IncDay()) sowohl auf Sa/So wie auch (wenn nicht Sa/So) auf Feiertag prüfen musst.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| uses DateUtils;
type TFeiertageTable = array of TDateTime;
function GetFeiertage : TFeiertageTable; begin end;
function CheckInFeiertage(ADate : TDateTime; AFeiertageTable : TFeiertageTable):boolean; var i : integer; begin result := false; for i := 0 to length(AFeiertageTable)-1 do begin if DateOf(ADate) = DateOf(AFeiertageTable[i]) then begin result := true; break; end; end; end;
function CheckInWeekend(ADateTime : TDateTime):boolean; begin result := DayOfTheWeek(ADateTime) in [6,7]; end;
procedure TForm1.Button1Click(Sender: TObject); var StartDate : TDateTime; FristDauer : integer;
NextDate : TDateTime; Feiertage : TFeiertageTable; begin StartDate := now; FristDauer := 14; Feiertage := GetFeiertage;
NextDate := IncDay(StartDate,FristDauer); while CheckInWeekend(NextDate) or CheckInFeiertage(NextDate,Feiertage) do incDay(NextDate,1); end; |
Blup - Mo 11.01.16 17:26
Zur besseren Lesbarkeit kann man auch die Konstanten benutzen:
Delphi-Quelltext
1: 2: 3: 4:
| function CheckInWeekend(ADateTime : TDateTime): Boolean; begin Result := DayOfTheWeek(ADateTime) in [DaySaturday, DaySunday]; end; |
Florian71 - Do 24.08.17 23:13
Um rauszufinden ob ein Datum ein Feiertag ist oder nicht, kannst Du diesen Web-Service / Micro-Service ausprobieren:
https://smart-webservice.com/publicholiday-service/
Da kann man auch Postleitzahlen / Bundesländer berücksichtigen lassen, z.B. ob das Datum 15.08.2017 im bundesland NRW ein Feiertag ist oder so.
Benötigt allerdings ein REST Zugriff - klappt z.B. über Indy Komponenten.
Delete - Fr 25.08.17 00:23
- Nachträglich durch die Entwickler-Ecke gelöscht -
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!