Feiertage berechnen
Eine Sache hatte ich noch offen mit den Feiertagen. Wenn man die Ostertage berechnet, kann auch der Rest der Feiertage berechnet werden.
Viele Feiertage sind auf ihr festgelegtes Datum fixiert. Bei einigen jedoch nicht und haben ihre Abhängigkeit zu den Ostertagen.
Benötigt
Rider, Visual Studio 2022 oder Visual Studio Code
Mindestens C# 10 (für TOP LEVEL Statement)
Feiertage berechnen
Mit der Eingabe des Jahres, sollen am Ende die Feiertage in der Console ausgegeben werden.
Wir feiern die Feste wie sie fallen
In meinem vorigen Blogeintrag habe ich bereits beschrieben, wie die Berechnung von den Osterfeiertagen Funktionen auf Gauß Osterformel setzt. Diese Berechnung wird für einige weitere ebenfalls verwendet. Bei den festen Feiertagen ist klar und unschön, wenn diese auf einen Samstag oder Sonntag fallen.
Zur Vollständigkeit habe ich auch die Berechnung des Ostertages mit reingenommen.
Console.WriteLine("Calculate German Feiertage!");
Console.WriteLine("Enter year:");
var year = int.Parse(Console.ReadLine());
var feiertage = new List<PuplicHoliday>();
var ostermontag = CalculateOstermontag(year);
feiertage.Add(new PuplicHoliday(ostermontag, "Ostermontag", "BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH"));
// neujahr
feiertage.Add(new PuplicHoliday(new DateTime(year, 1, 1), "Neujahr", "BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH"));
// heilige drei könige
feiertage.Add(new PuplicHoliday(new DateTime(year, 1, 6), "Heilige Drei Könige", "BW, BY, ST"));
// internationaler frauentag
feiertage.Add(new PuplicHoliday(new DateTime(year, 3, 8), "Internationaler Frauentag", "BE, MV"));
// karfreitag
feiertage.Add(new PuplicHoliday(ostermontag.AddDays(-2), "Karfreitag", "SL"));
// ostersonntag
feiertage.Add(new PuplicHoliday(ostermontag.AddDays(-1), "Ostersonntag", "BB"));
// tag der arbeit
feiertage.Add(new PuplicHoliday(new DateTime(year, 5, 1), "Tag der Arbeit", "BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH"));
// christi himmelfahrt
feiertage.Add(new PuplicHoliday(ostermontag.AddDays(39), "Christi Himmelfahrt", "BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH"));
// pfingstsonntag
feiertage.Add(new PuplicHoliday(ostermontag.AddDays(49), "Pfingstsonntag", "BB"));
// pfingstmontag
feiertage.Add(new PuplicHoliday(ostermontag.AddDays(50), "Pfingstmontag", "BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH"));
// fronleichnam
feiertage.Add(new PuplicHoliday(ostermontag.AddDays(60), "Fronleichnam", "BW, BY, HE, NW, RP, SL"));
// mariä himmelfahrt
feiertage.Add(new PuplicHoliday(new DateTime(year, 8, 15), "Mariä Himmelfahrt", "BY, SL"));
// tag der deutschen einheit
feiertage.Add(new PuplicHoliday(new DateTime(year, 10, 3), "Tag der deutschen Einheit", "BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH"));
// reformationstag
feiertage.Add(new PuplicHoliday(new DateTime(year, 10, 31), "Reformationstag", "BB, HB, HH, MV, NI, SN, ST, SH, TH"));
// allerheiligen
feiertage.Add(new PuplicHoliday(new DateTime(year, 11, 1), "Allerheiligen", "BW, BY, NW, RP, SL"));
// buß- und bettag
feiertage.Add(new PuplicHoliday(ostermontag.AddDays(-47), "Buß- und Bettag", "SN"));
// 1. weihnachtstag
feiertage.Add(new PuplicHoliday(new DateTime(year, 12, 25), "1. Weihnachtstag", "BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH"));
// 2. weihnachtstag
feiertage.Add(new PuplicHoliday(new DateTime(year, 12, 26), "2. Weihnachtstag", "BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH"));
var orderedFeiertage = feiertage.OrderBy(x => x.HolidayDate);
foreach (var holiday in orderedFeiertage)
{
Console.WriteLine($"Datum: {holiday.HolidayDate.ToShortDateString()}, Beschreibung: {holiday.Description}, Bundesländer: {holiday.Bundeslaender}");
}
Console.ReadLine();
// statische methode berechnet den ostermontag
static DateTime CalculateOstermontag(int year)
{
var a = year % 19; // Zyklus
var b = year % 4; // Schaltjahr
var c = year % 7;
var k = year / 100;
var p = (8 * k + 13) / 25;
var q = k / 4;
var m = (15 + k - p - q) % 30; // Korrektur Sonntag und Montag gleichung
var n = (4 + k - q) % 7; // Korrektur Sonnengleichung
var d = (19 * a + m) % 30; // Mondentfernung
var e = (2 * b + 4 * c + 6 * d + n) % 7;
var day = 22 + d + e;
return (new DateTime(year, 3, 1)).AddDays(day);
}
public class PuplicHoliday
{
public PuplicHoliday(DateTime holidayDate, string description, string bundeslaender)
{
this.HolidayDate = holidayDate;
this.Description = description;
this.Bundeslaender = bundeslaender;
}
public string Bundeslaender { get; }
public string Description { get; }
public DateTime HolidayDate { get; }
}
Wird der Code ausgeführt, sollte am Ende in der richtigen Reihenfolge, die Feiertage im Consolen Fenster zu lesen sein.
Zum Schluss
Wenn man das einmal durch gegangen ist, ist die Berechnung der restlichen der Feiertage simple umzusetzen.
Referenzen
Gesetzliche Feiertage in Deutschland – Wikipedia
Kommentare