Вычисление немецких праздников
Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch
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 uber seinen Tag\Monat hinzuzufugen
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 uber die Datumsseriennummer hinzuzufugen
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
// Hinzufugen 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
// Hinzufugen der Feiertage, die von Ostern abhangen
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
|