Announcement

Collapse
No announcement yet.

Feiertage und so weiter

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Feiertage und so weiter

    Hallo,

    gibts einen Algorithmus der berechnet, ob ein eingegebenes Datum ein Feiertag ist oder nicht?

    MfG

    Wolfgang Lemmermeyer

  • #2
    Hallo,<P>
    diese Klasse hab ich immer eingebunden, keine Ahnung mehr, wo die her ist:<P>
    {
    <br>&nbsp; Klasse zum ermitteln der festen und beweglichen Feiertage
    <br>&nbsp; aller Bundesl&auml;nder.
    <p>&nbsp; Bei Jahreszahlen, die in der Vergangenheit liegen, stimmen nicht
    <br>&nbsp; alle Feiertage (z.b. Tag der deutschen Einheit, den gibt es
    erst seit
    <br>&nbsp; 1991(?) )
    <p>&nbsp; Feiertage, die innerhalb eines Bundeslandes nur Stadtbezogen
    sind,
    <br>&nbsp; sind nicht implementiert.
    <br>&nbsp; Die wichtigsten sind aber alle da und stimmen hoffentlich auch,
    aber...
    <br>&nbsp; ...f&uuml;r die Richtigkeit der Feiertage gebe ich keine Gew&auml;hr

    <p>&nbsp; -----------------------------------------------------
    <br>&nbsp; Autor:&nbsp;&nbsp;&nbsp; Dieter Hildenbrand
    <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;
    E-Mail: [email protected]
    <p>&nbsp; Compiler: Delphi 3.0
    <br>&nbsp; -----------------------------------------------------
    <p>&nbsp; Abk&uuml;rzungen der Bundesl&auml;nder&nbsp; (TLand)
    <p>&nbsp; BW Baden W&uuml;rtemberg
    <br>&nbsp; BY Bayern
    <br>&nbsp; BE Berlin
    <br>&nbsp; BB Brandenburg
    <br>&nbsp; HB Bremen
    <br>&nbsp; HH Hamburg
    <br>&nbsp; HE Hessen
    <br>&nbsp; MV Mecklenburg-Vorpommern
    <br>&nbsp; NI Niedersachsen
    <br>&nbsp; NW Nordrhein-Westfalen
    <br>&nbsp; RP Rheinland-Pfalz
    <br>&nbsp; SL Saarland
    <br>&nbsp; SN Sachsen
    <br>&nbsp; ST Sachsen-Anhalt
    <br>&nbsp; SH Schleswig Holstein
    <br>&nbsp; TH Th&uuml;ringen
    <p>&nbsp; }
    <p>unit UnitFeiertage;
    <p>interface
    <p>uses
    <br>&nbsp; SysUtils, Classes;
    <p>type
    <br>&nbsp; TLand =(BW,BY,BE,BB,HB,HH,HE,MV,NI,NW,RP,SL,SN,ST,SH,TH) ;
    <p>type
    <br>&nbsp; TFeiertage = class
    <br>&nbsp; private
    <br>&nbsp;&nbsp;&nbsp;&nbsp; FLand : TLand;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; FJahr : integer;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; FTage : TStringList;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; FOstern : TDateTime;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; procedure Feiertage;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; procedure Ostern;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; procedure SetFJahr(value:integer);
    <br>&nbsp;&nbsp;&nbsp;&nbsp; procedure SetFLand(value:TLand);
    <br>&nbsp; public
    <br>&nbsp;&nbsp;&nbsp;&nbsp; constructor init(ajahr:integer);
    <br>&nbsp;&nbsp;&nbsp;&nbsp; destructor Destroy;override;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; function IstFeiertag(tag,monat,jahr:integer):boolean;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; property Jahr: integer read FJahr write SetFJahr;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; property Land: TLand read FLand write SetFLand;
    <br>end;
    <p>implementation
    <p>constructor TFeiertage.init(ajahr : integer);
    <br>var
    <br>&nbsp; j,m,t: Word;
    <br>begin
    <br>&nbsp;// ShortDateFormat := 'dd.mm.yyyy';
    <br>&nbsp; FJahr := ajahr;
    <br>&nbsp; FLand := BW;
    <br>&nbsp; FTage := TStringList.Create;
    <br>&nbsp; Feiertage;
    <br>end;
    <p>destructor TFeiertage.Destroy;
    <br>begin
    <br>&nbsp; FTage.Free;
    <br>&nbsp; inherited Destroy;
    <br>end;
    <p>procedure TFeiertage.SetFJahr(value:integer);
    <br>begin
    <br>&nbsp; if value &lt;> FJahr then
    <br>&nbsp; begin
    <br>&nbsp;&nbsp;&nbsp;&nbsp; FJahr := value;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; Feiertage;
    <br>&nbsp; end;
    <br>end;
    <p>procedure TFeiertage.SetFLand(value:TLand);
    <br>begin
    <br>&nbsp; if value &lt;> FLand then
    <br>&nbsp; begin
    <br>&nbsp;&nbsp;&nbsp;&nbsp; FLand := value;
    <br>&nbsp;&nbsp;&nbsp;&nbsp; Feiertage;
    <br>&nbsp; end;
    <br>end;
    <p>procedure TFeiertage.Feiertage;
    <br>var
    <br>&nbsp; temp: TDateTime;
    <br>begin
    <br>&nbsp; Ostern;
    <br>&nbsp; FTage.Clear;
    <p>&nbsp; //feste Feiertage aller L&auml;nder
    <br>&nbsp; FTage.Add('01.01.' + IntToStr(FJahr));&nbsp;&nbsp; //Neujahr
    <br>&nbsp; FTage.Add('01.05.' + IntToStr(FJahr));&nbsp;&nbsp; //Maifeiertag
    <br>&nbsp; FTage.Add('03.10.' + IntToStr(FJahr));&nbsp;&nbsp; //Tag der
    deutschen Einheit
    <br>&nbsp; FTage.Add('25.12.' + IntToStr(FJahr));&nbsp;&nbsp; //1.Weihnachtsfeiertag
    <br>&nbsp; FTage.Add('26.12.' + IntToStr(FJahr));&nbsp;&nbsp; //2.Weihnachtsfeiertag
    &#10
    Schöne Grüße, Mario

    Comment


    • #3
      und weiter gehts...<P>
      &nbsp; //bewegliche Feiertage aller L&auml;nder
      <br>&nbsp; FTage.Add(DateToStr(FOstern - 2));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      //Karfreitag
      <br>&nbsp; FTage.Add(DateToStr(FOstern));&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      //Ostersonntag
      <br>&nbsp; FTage.Add(DateToStr(FOstern + 1));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      //Ostermontag
      <br>&nbsp; FTage.Add(DateToStr(FOstern + 39));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      //Himmelfahrt
      <br>&nbsp; FTage.Add(DateToStr(FOstern + 49));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      //Pfingstsonntag
      <br>&nbsp; FTage.Add(DateToStr(FOstern + 50));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      //Pfingstmontag
      <p>&nbsp; //feste und bewegliche Feiertage nicht aller L&auml;nder
      <br>&nbsp; if FLand in [BW,BY,ST] then
      <br>&nbsp; FTage.Add('06.01.' + IntToStr(FJahr));&nbsp;&nbsp; //Heilige
      3 K&ouml;nige
      <p>&nbsp; if FLand in [BW,BY,HE,NW,RP,SL,SN,TH] then
      <br>&nbsp; FTage.Add(DateToStr(FOstern + 60));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      //Fronleichnam
      <p>&nbsp; if FLand in [BY,SL] then
      <br>&nbsp; FTage.Add('15.08.' + IntToStr(FJahr));&nbsp;&nbsp; //Mari&auml;
      Aufnahme
      <p>&nbsp; if FLand in [BB,MV,SN,ST,TH] then
      <br>&nbsp; FTage.Add('31.10.' + IntToStr(FJahr));&nbsp;&nbsp; //Reformationstag
      <p>&nbsp; if FLand in [BW,BY,NW,RP,SL] then
      <br>&nbsp; FTage.Add('01.11.' + IntToStr(FJahr));&nbsp;&nbsp; //Allerheiligen
      <p>&nbsp; if FLand = SN then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      //Bu&szlig;-und Bettag
      <br>&nbsp; begin
      <br>&nbsp;&nbsp;&nbsp;&nbsp; temp := StrToDate('17.11.'+ IntToStr(FJahr));
      <br>&nbsp;&nbsp;&nbsp;&nbsp; while DayOfWeek(temp) &lt;> 4 do
      <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp := temp + 1;
      <br>&nbsp;&nbsp;&nbsp;&nbsp; FTage.Add(DateToStr(temp));
      <br>&nbsp; end;
      <br>end;
      <p>// Ermitteln des Ostersonntags (korrektes Datum nur von 1583-2399)
      <br>// Die Funktion stammt aus dem SWAG-Archiv
      <br>procedure TFeiertage.Ostern;
      <br>var
      <br>&nbsp; nMonth, nDay, nMoon, nEpact, nSunday, nGold, nCent, nCorx, nCorz:
      Integer;
      <br>begin
      <br>&nbsp; { The Golden Number of the year in the 19 year Metonic Cycle
      }
      <br>&nbsp; nGold := ( ( FJahr mod 19 ) + 1&nbsp; );
      <p>&nbsp; { Calculate the Century }
      <br>&nbsp; nCent := ( ( FJahr div 100 ) + 1 );
      <p>&nbsp; { No. of Years in which leap year was dropped in order to keep
      in step
      <br>&nbsp; with the sun }
      <br>&nbsp; nCorx := ( ( 3 * nCent ) div 4 - 12 );
      <p>&nbsp; { Special Correction to Syncronize Easter with the moon's orbit
      }
      <br>&nbsp; nCorz := ( ( 8 * nCent + 5 ) div 25 - 5 );
      <p>&nbsp; { Find Sunday }
      <br>&nbsp; nSunday := ( ( 5 * FJahr ) div 4 - nCorx - 10 );
      <p>&nbsp; { Set Epact (specifies occurance of full moon }
      <br>&nbsp; nEpact := ( ( 11 * nGold + 20 + nCorz - nCorx ) mod 30 );
      <p>&nbsp; if ( nEpact &lt; 0 ) then
      <br>&nbsp;&nbsp;&nbsp;&nbsp; nEpact := nEpact + 30;
      <p>&nbsp; if ( ( nEpact = 25 ) and ( nGold > 11 ) ) or ( nEpact = 24 )
      then
      <br>&nbsp;&nbsp;&nbsp;&nbsp; nEpact := nEpact + 1;
      <p>&nbsp; { Find Full Moon }
      <br>&nbsp; nMoon := 44 - nEpact;
      <p>&nbsp; if ( nMoon &lt; 21 ) then
      <br>&nbsp;&nbsp;&nbsp;&nbsp; nMoon := nMoon + 30;
      <p>&nbsp; { Advance to Sunday }
      <br>&nbsp; nMoon := ( nMoon + 7 - ( ( nSunday + nMoon ) mod 7 ) );
      <p>&nbsp; if ( nMoon > 31 ) then
      <br>&nbsp; begin
      <br>&nbsp;&nbsp;&nbsp;&nbsp; nMonth := 4;
      <br>&nbsp;&nbsp;&nbsp;&nbsp; nDay&nbsp;&nbsp; := ( nMoon - 31 );
      <br>&nbsp; end
      <br>&nbsp;&nbsp;&nbsp; else
      <br>&nbsp; begin
      <br>&nbsp;&nbsp;&nbsp;&nbsp; nMonth := 3;
      <br>&nbsp;&nbsp;&nbsp;&nbsp; nDay&nbsp;&nbsp; := nMoon;
      <br>&nbsp; end;
      <p>&nbsp; FOstern := EncodeDate( FJahr, nMonth, nDay );
      <br>end;
      <p>function TFeiertage.IstFeiertag(tag,monat,jahr:integer):boo lean;
      <br>var
      <br>&nbsp; ret:boolean;
      <br>&nbsp; j:integer;
      <br>&nbsp; temp1,temp2:TDateTime;
      <br>begin
      <br>&nbsp; ret := false;
      <br>&nbsp; temp1 := EncodeDate(jahr,monat,tag);
      &#10
      Schöne Grüße, Mario

      Comment


      • #4
        &nbsp; for j := 0 to FTage.Count - 1 do
        <br>&nbsp; begin
        <br>&nbsp;&nbsp;&nbsp;&nbsp; temp2 := StrToDate(FTage.Strings[j]);
        <br>&nbsp;&nbsp;&nbsp;&nbsp; if temp1 = temp2 then
        <br>&nbsp;&nbsp;&nbsp;&nbsp; begin
        <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret := true;
        <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Break;
        <br>&nbsp;&nbsp;&nbsp;&nbsp; end;
        <br>&nbsp; end;
        <p>&nbsp; Result := ret;
        <br>end;
        <p>end
        Schöne Grüße, Mario

        Comment


        • #5
          Hallo Mario!

          Vielen herzlichen Dank!

          Wolfgan

          Comment

          Working...
          X