...die deutschen Feiertage berechnen?

Autor: Benny Baumann

Kategorie: Mathematik

unit Feiertage;
// Unit Holidays;

interface

uses
  
Windows, SysUtils;

// Declare a structure to hold the Information
// Deklarieren der Struktur, um die Feiertage abzuspeichern
type
  
THoliday = record
    
Date: TDateTime;
    Name: string;
  end;
  THolidayTable = array of THoliday;

// Function to call to get the Holiday Table with all Holidays of a year
// Der Funktionsaufruf, um die Feiertage eines Jahres abzufragen
function GetHolidayTable(Year: Word): THolidayTable;

implementation

function 
TUrlaubsForm.GetHolidayTable(Year: Word): THolidayTable;

  // Function to add a holiday by Day and Month
  // Funktion, um einen Feiertag über seinen Tag\Monat hinzuzufügen
  
procedure AddHoliday(DD, MM: Word; HDName: string); overload;
  begin
    
SetLength(Result, High(Result) + 2);
    with Result[High(Result)] do
    begin
      
Date := EncodeDate(Year, MM, DD);
      Name := HDName;
    end;
  end;

  //Function to add holiday by date serial
  //Funktion, um den Feiertag über die Datumsseriennummer hinzuzufügen
  
procedure AddHoliday(HDDate: TDateTime; HDName: string); overload;
  begin
    
SetLength(Result, High(Result) + 2);
    with Result[High(Result)] do
    begin
      
Date := HDDate;
      Name := HDName;
    end;
  end;

  // Function to get easter sunday
  // Function zur Berechnung des Ostersonntags
  
function GetEasterDate(YYYY: Word): TDateTime;
  var
    
A, B, C, D, E, F, G, H, I, K, L, M, N, P: Word;
    DD, MM: Word;
  begin
    
a := YYYY mod 19;
    b := YYYY div 100;
    c := YYYY mod 100;
    d := b div 4;
    e := b mod 4;
    f := (b + 8) div 25;
    g := (b - f + 1) div 3;
    h := (19 * a + b - d - g + 15) mod 30;
    i := c div 4;
    k := c mod 4;
    l := (32 + 2 * e + 2 * i - h - k) mod 7;
    m := (a + 11 * h + 22 * l) div 451;
    n := (h + l - 7 * m + 114) div 31;
    p := (h + l - 7 * m + 114) mod 31 + 1;
    DD := p;
    MM := n;
    Result := EncodeDate(YYYY, MM, DD);
  end;
  
var
  
EDate: TDateTime;
begin
  
// Add fixed holidays
  // Hinzufügen der festen Feiertage
  
AddHoliday(1, 1, 'Neujahr');
  AddHoliday(1, 5, 'Tag der Arbeit');
  AddHoliday(3, 10, 'Tag der deutschen Einheit');
  AddHoliday(31, 10, 'Reformationstag');
  // AddHoliday(24, 12, 'Heiligabend');
  
AddHoliday(25, 12, '1. Weihnachtsfeiertag');
  AddHoliday(26, 12, '2. Weihnachtsfeiertag');
  // AddHoliday(31, 12, 'Silvester');
  // Add holidays relative to easter sunday
  // Hinzufügen der Feiertage, die von Ostern abhängen
  
EDate := GetEasterDate(Year);
  AddHoliday(EDate, 'Ostersonntag');
  AddHoliday(EDate - 2, 'Karfreitag');
  AddHoliday(EDate + 1, 'Ostermontag');
  AddHoliday(EDate + 39, 'Christi Himmelfahrt');
  AddHoliday(EDate + 49, 'Pfingstsonntag');
  AddHoliday(EDate + 50, 'Pfingstmontag');
  // Gets 3rd Wednesday in November
  // Ermittelt den 3. Mitwoch im November
  
EDate := EncodeDate(Year, 11, 1);
  EDate := EDate + ((11 - DayOfWeek(EDate)) mod 7) + 14;
  AddHoliday(EDate, 'Buß- und Bettag');
end;

end.

// This Units works since the year 1584
// Diese Unit arbeitet mit Jahreszahlen nach 1584

 

printed from
www.swissdelphicenter.ch
developers knowledge base